- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
想象一下这个场景:
m1()
,由C1类实现m2()
,由C2类实现m3()
,由C3类实现我想定义接受参数 arg
的函数。
void f1(I1 arg) {
use m1()
}
void f2([I1, I2] arg) {
use m1() and m2()
}
void f3([I2, I3] arg) {
use m2() and m3()
}
然后我要定义:
然后我想实例化C123并将其与f1
、f2
、f3
一起使用。
C123 obj;
f1(obj);
f2(obj);
f3(obj);
f2
将采用 [C1, C2] 而不是 [I1, I2]。#include <string>
#include <iostream>
using namespace std;
class C1 {
protected:
int i;
public:
int getI() const { return i; }
void setI(int i_) { i = i_; }
};
class C2 {
protected:
string s;
public:
string getS() const { return s; }
void setS(string s_) { s = s_; }
};
class C3 {
protected:
float f;
public:
float getF() const { return f; }
void setF(float f_) { f = f_; }
};
class C23 : public C2, public C3 {};
class C123 : public C1, public C2, public C3 {};
void f3(C23 arg) {
arg.setS(to_string(arg.getF()));
}
int main() {
C123 obj;
f3(obj);
std::cout << obj.getS();
}
a.cc: In function ‘int main()’:
a.cc:42:9: error: could not convert ‘obj’ from ‘C123’ to ‘C23’
f3(obj);
最佳答案
- Is this possible in C++?
是的,可以用 C++ 实现。
#include <string>
#include <iostream>
using namespace std;
class I1 {
public:
virtual int getI() const = 0;
virtual void setI(int i) = 0;
};
class I2 {
public:
virtual string getS() const = 0;
virtual void setS(string s) = 0;
};
class I3 {
public:
virtual float getF() const = 0;
virtual void setF(float f) = 0;
};
class C1 : public I1 {
protected:
int i;
public:
int getI() const { return i; }
void setI(int i_) { i = i_; }
};
class C12 : public I1, public I2 {
protected:
int i;
string s;
public:
int getI() const { return i; }
void setI(int i_) { i = i_; }
string getS() const { return s; }
void setS(string s_) { s = s_; }
};
class C123 : public I1, public I2, public I3 {
protected:
int i;
string s;
float f;
public:
int getI() const { return i; }
void setI(int i_) { i = i_; }
string getS() const { return s; }
void setS(string s_) { s = s_; }
float getF() const { return f; }
void setF(float f_) { f = f_; }
};
template<class T>
void f1(const T& c1)
{
cout << "f1:\n";
cout << " getI: " << c1.getI() << endl;
}
template<class T>
void f2(const T& c12)
{
cout << "f2:\n";
cout << " getI: " << c12.getI() << endl;
cout << " getS: " << c12.getS() << endl;
}
template<class T>
void f3(const T& c23)
{
cout << "f3:\n";
cout << " getS: " << c23.getS() << endl;
cout << " getF: " << c23.getF() << endl;
}
void test()
{
C1 c1;
c1.setI(1);
f1(c1);
cout << "\n===== " << endl;
C12 c12;
c12.setI(12);
c12.setS("str12");
f1(c12);
f2(c12);
cout << "\n===== " << endl;
C123 c123;
c123.setI(123);
c123.setF(1.23f);
c123.setS("str123");
f1(c123);
f2(c123);
f3(c123);
cout << "\n===== " << endl;
}
int main()
{
test();
}
- Is it possible without interfaces? Eg. function f2 would take [C1, C2] instead of [I1, I2].
是的,没有接口(interface)也可以做到这一点。
#include <string>
#include <iostream>
using namespace std;
class C1 {
protected:
int i;
public:
int getI() const { return i; }
void setI(int i_) { i = i_; }
};
class C2 {
protected:
string s;
public:
string getS() const { return s; }
void setS(string s_) { s = s_; }
};
class C3 {
protected:
float f;
public:
float getF() const { return f; }
void setF(float f_) { f = f_; }
};
class C12 : public virtual C1, public virtual C2
{
};
class C23 : public virtual C2, public virtual C3
{
};
class C123 : public virtual C1, public virtual C12, public virtual C23
{
};
void f1(const C1& c1)
{
cout << "f1:\n";
cout << " getI: " << c1.getI() << endl;
}
void f2(const C12& c12)
{
cout << "f2:\n";
cout << " getI: " << c12.getI() << endl;
cout << " getS: " << c12.getS() << endl;
}
void f3(const C23& c23)
{
cout << "f3:\n";
cout << " getS: " << c23.getS() << endl;
cout << " getF: " << c23.getF() << endl;
}
void test()
{
C1 c1;
c1.setI(1);
f1(c1);
cout << "\n===== " << endl;
C12 c12;
c12.setI(12);
c12.setS("str12");
f1(c12);
f2(c12);
cout << "\n===== " << endl;
C123 c123;
c123.setI(123);
c123.setF(1.23f);
c123.setS("str123");
f1(c123);
f2(c123);
f3(c123);
cout << "\n===== " << endl;
}
int main()
{
test();
}
一些解释。如果你需要你的 f2 只接受 C1 和 C2(没有 C3),那么它必须是在 C1 和 C2 上都继承的独立类型。 f3 也一样。然后,如果您遵循该逻辑并在不使用虚拟继承的情况下创建类 C12
和 C23
,那么您现在应该从 C12 和 C23 继承的 C123 最终将具有多个拷贝C2,当您调用 f2 和 f3 时,您会从 getS
获得不同的值。虚拟继承确保在继承层次结构中只有一个类的拷贝。
a "union" class C123 which inherits implemented methods from existing classes C1, C2, C3
#include <string>
#include <iostream>
using namespace std;
class I1 {
public:
virtual int getI() const = 0;
virtual void setI(int i) = 0;
};
class I2 {
public:
virtual string getS() const = 0;
virtual void setS(string s) = 0;
};
class I3 {
public:
virtual float getF() const = 0;
virtual void setF(float f) = 0;
};
class I12 : virtual public I1, virtual public I2 {};
class I23 : virtual public I2, virtual public I3 {};
class I123 : virtual public I12, virtual public I23 {};
class C1 : virtual public I1 {
protected:
int i;
public:
int getI() const { return i; }
void setI(int i_) { i = i_; }
};
class C2 : virtual public I2 {
protected:
string s;
public:
string getS() const { return s; }
void setS(string s_) { s = s_; }
};
class C3 : virtual public I3 {
protected:
float f;
public:
float getF() const { return f; }
void setF(float f_) { f = f_; }
};
class C12 : public I12, public C1, public C2 {};
class C123 : public I123, public C1, public C2, public C3 {};
void f1(const I1& c1)
{
cout << "f1:\n";
cout << " getI: " << c1.getI() << endl;
}
void f2(const I12& c12)
{
cout << "f2:\n";
cout << " getI: " << c12.getI() << endl;
cout << " getS: " << c12.getS() << endl;
}
void f3(const I123& c23)
{
cout << "f3:\n";
cout << " getS: " << c23.getS() << endl;
cout << " getF: " << c23.getF() << endl;
}
void test()
{
C1 c1;
c1.setI(1);
f1(c1);
cout << "\n===== " << endl;
C12 c12;
c12.setI(12);
c12.setS("str12");
f1(c12);
f2(c12);
cout << "\n===== " << endl;
C123 c123;
c123.setI(123);
c123.setF(1.23f);
c123.setS("str123");
f1(c123);
f2(c123);
f3(c123);
cout << "\n===== " << endl;
}
int main()
{
test();
}
所有解决方案都应产生此输出:
f1:
getI: 1
=====
f1:
getI: 12
f2:
getI: 12
getS: str12
=====
f1:
getI: 123
f2:
getI: 123
getS: str123
f3:
getS: str123
getF: 1.23
=====
关于C++ 接口(interface)、继承、多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43430511/
编写一个仅用于集中其他接口(interface)的接口(interface)是好的做法还是坏的做法? interface InterfaceA : InterfaceB, InterfaceC { }
有没有一种方法可以确定具体类型从任意接口(interface)列表?我知道类型转换,但我想知道所有满意的接口(interface)。 例如,给定: type Mover interface { Mo
我正在尝试制作斐波那契堆。 (在我正在上的算法课中多次提到它们,我想检查一下。)我希望堆使用任何类型的节点,所以我定义了一个 Node 接口(interface): package node type
这是我的代码: type IA interface { FB() IB } type IB interface { Bar() string } type A struct {
示例 A: // pseudo code interface IFoo { void bar(); } class FooPlatformA : IFoo { void bar() {
合并它编译的 leppies 反馈 - 但 IMO 有一些缺点,我希望编译器强制每个子类定义它们自己的 Uri 属性。现在的代码: [] type UriUserControl() = inh
我正在构建一个项目,该项目从用户那里获取一个术语,然后执行谷歌搜索并返回一个 json 格式的标题列表。 我正在使用 serpwow API 来执行谷歌搜索并试图解析响应。 但是我收到的错误是: pa
我只想在其他接口(interface)中实现某些接口(interface),我不希望它们能够被类直接继承。 提前致谢! 最佳答案 您不能在 C# 中执行此操作 - 任何类都可以实现它有权访问的任何接口
我是 Go 的新手,还有一些我还没有掌握的技巧 例如,我有一个可以这样调用的函数: myVar.InitOperation("foo",Operator.EQUAL,"bar") myVar.Init
我有一个通用接口(interface)来描述对输出流的访问,如下所示: interface IOutput { function writeInteger(aValue:Int):Void;
我正在做一个项目,我想通过某种接口(interface)(最好是 USB)将光电探测器电路安装到计算机上。但是,由于我是新手,所以我不知道应该朝哪个方向处理这个问题。假设我有一个带有 USB 连接的光
背景 我正在尝试创建一个简单的应用程序,以真正理解DDD + TDD + etc的整个堆栈。我的目标是在运行时动态注入DAL存储库类。这让我 域和应用程序服务层可测试。我打算用“穷人的DI”来完成 现
在 Java 中,接口(interface)扩展接口(interface)是完全合法的。 UML 中的这种关系看起来像“扩展”关系(实线、闭合、未填充的箭头)还是“实现”关系(虚线、闭合、未填充的箭头
我想创建一个具有相等和比较函数默认实现的接口(interface)。 如果我从类型 IKeyable 中删除所有内容除了Key成员,只要我不添加默认实现,它就是一个有效的接口(interface)。从
COM 中的双接口(interface)是能够通过 DispInterface 或 VTable 方法访问的接口(interface)。 现在有人可以告诉我这两种方法之间到底有什么区别吗? 我认为 V
我有一个类方法,它返回一个可以迭代的员工列表。返回列表的最佳方式是什么?通常我只返回一个 ArrayList。然而,据我了解,界面更适合这种类型的操作。哪个是最好使用的界面?另外,为什么返回接口(in
我想从包装类外部实例化一个内部非静态接口(interface)。 这可能吗? 考虑以下代码: shared class AOuterClass() { Integer val = 3; shared
我为一个类编写了一个接口(interface),如下所示: public interface IGenericMultipleRepository { Lazy> addresses { ge
我是 UML 的初学者,现在我正在创建一个序列图,问题是我想根据用户输入实现 DAO 接口(interface)。如何在时序图中正确绘制以实现接口(interface)。 最佳答案 您不会在 SD 上
要使用 jsr 303 验证创建有条件验证的组,请将接口(interface)类传递给注释,如下所示: @NotEmpty (groups={UpdateValue.class}) 我有很多不同的接口
我是一名优秀的程序员,十分优秀!