Java对class
和进行了明确区分interface
。(我相信C#也可以,但是我没有经验)。但是,在编写C ++时,类和接口之间没有语言强制的区分。
因此,我一直将接口视为解决Java中缺乏多重继承的一种解决方法。在C ++中做出这样的区分是任意的,毫无意义的。
我一直倾向于使用“以最明显的方式编写东西”的方法,因此,如果在C ++中,我得到了Java中所谓的接口,例如:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() = 0;
};
然后,我决定大多数的实现者Foo
都想共享一些我可能会写的通用功能:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() {}
protected:
// If it needs this to do its thing:
int internalHelperThing(int);
// Or if it doesn't need the this pointer:
static int someOtherHelper(int);
};
然后,这使它不再是Java的接口。
相反,C ++具有两个重要概念,它们与相同的基础继承问题有关:
virtual
继承力没有成员变量的类用作基类时不会占用额外的空间
“基类子对象的大小可能为零”
在我尝试尽可能避免的那些方法中,很少会遇到真正是“最清洁”设计的情况。#2是我对术语“接口”的理解与C ++语言功能之间的细微但重要的区别。因此,我目前(几乎)从来没有将事物称为C ++中的“接口”,而是谈论基类及其大小。我会说,在C ++的上下文中,“接口”是用词不当。
尽管没有多少人做出这样的区分,但引起了我的注意。
- 通过允许(例如
protected
)非virtual
功能存在于C ++的“接口”中,我会失去任何东西吗?(我的感觉恰恰相反-共享代码的位置更自然) - 术语“接口”在C ++中是否有意义-是仅表示纯文本
virtual
还是将没有成员变量的C ++类称为接口仍然公平?
~Foo() {}
在几乎所有情况下,抽象类中的公众都是错误。
internalHelperThing
可以在几乎所有情况下模拟C#。