Ява проводит четкое различие между 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
inhertianceКлассы без переменных-членов не могут занимать дополнительное место при использовании в качестве базы
«Подобъекты базового класса могут иметь нулевой размер»
Из тех, кого я стараюсь избегать №1, везде, где это возможно - редко можно встретить сценарий, где это действительно самый «чистый» дизайн. # 2, однако, является тонким, но важным различием между моим пониманием термина «интерфейс» и особенностями языка C ++. В результате этого я в настоящее время (почти) никогда не называю вещи «интерфейсами» в C ++ и говорю о базовых классах и их размерах. Я бы сказал, что в контексте C ++ «интерфейс» является неправильным.
Хотя до меня дошло, что не так много людей делают такое различие.
- Стоит ли мне что-то терять, позволяя (например
protected
) не-virtual
функциям существовать в «интерфейсе» в C ++? (Мое чувство как раз наоборот - более естественное место для общего кода) - Является ли термин «интерфейс» значимым в C ++ - подразумевает ли он только чистый
virtual
или было бы справедливо называть классы C ++ без переменных-членов интерфейсом по-прежнему?
~Foo() {}
в абстрактном классе является ошибкой (почти) при любых обстоятельствах.
internalHelperThing
можно смоделировать почти во всех случаях.