자바는 사이에 명확한 구분을하게 class
하고 interface
. (C #도 마찬가지라고 생각하지만 경험이 없습니다.) 그러나 C ++을 작성할 때 클래스와 인터페이스 사이에 언어로 구별되는 것은 없습니다.
결과적으로 나는 항상 인터페이스가 자바에서 다중 상속이 없다는 해결 방법으로 보았습니다. 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
상속멤버 변수가없는 클래스는 기본으로 사용될 때 추가 공간을 차지할 수 없습니다
"기본 클래스 하위 오브젝트의 크기는 0 일 수 있습니다"
가능한 한 # 1을 피하려고하는 사람들 중-그것이 가장 깨끗한 디자인 인 시나리오는 거의 발생하지 않습니다. 그러나 # 2는 "인터페이스"라는 용어에 대한 이해와 C ++ 언어 기능 사이의 미묘하지만 중요한 차이점입니다. 이 결과로 나는 현재 (거의) C ++에서 "인터페이스"라고 절대 언급하지 않으며 기본 클래스와 크기 측면에서 이야기합니다. 나는 C ++의 맥락에서 "인터페이스"는 잘못된 이름이라고 말한다.
많은 사람들이 그런 구별을하지는 않지만 그것은 나의 관심을 끌었습니다.
- C ++의 "인터페이스"내에 (예를 들어
protected
) 비virtual
기능이 존재 하도록함으로써 아무것도 잃어 버리지 않습니까? (제 느낌은 정반대입니다-공유 코드의 자연스러운 위치) - 용어 "인터페이스"는 C ++의 의미 - 그것은 의미 않습니다 만 순수
virtual
또는 공정없이 멤버 변수 여전히 인터페이스와 C ++ 클래스를 호출하는 것입니다?
~Foo() {}
추상 클래스 의 대중 은 모든 상황에서 (거의) 오류입니다.
internalHelperThing
거의 모든 경우에서 시뮬레이션 할 수있다.