두 가지 메소드가있는 C++ 인터페이스가 있습니다. 이 인터페이스를 구현하는 모든 클래스는 두 가지 메소드 중 적어도 하나를 구현해야하지만 둘 다 정의 할 수 있습니다. 그러나 둘 다 정의 할 필요는 없습니다. 그런 상황에서 사용할 수있는 가장 좋은 패턴은 무엇입니까? 다음과 같은해당 메소드의 서브 세트를 통해 인터페이스 구현
답변
뭔가 :
문제는 이미 잘못도 클래스가 그것의 기반이되는 것입니다 이럴class MyInterface
{
public:
virtual ~MyInterface() {}
virtual void foo() = 0;
virtual void bar() = 0;
};
class MyAbstractClass : public MyInterface
{
public:
virtual ~MyAbstractClass();
// Provide implementation for foo or bar
virtual void foo() override { }
virtual void bar() override { }
};
class MyNewClass : public MyAbstractClass
{
// Implement either of foo or bar or can be both
};
MyAbstractClass가 MyInterface에서 상속되지 않았습니다. 어쨌든 MyAbstractClass의 요점은 순수 가상 대신 MyInterface 메서드를 가상으로 만드는 이유는 무엇입니까? – ponayz
MyInterface가 누락 된 것에 대해 유감스럽게 생각합니다. 또한, OP는 _ "나는 두 가지 방법으로 C++ 인터페이스를 가지고있다."_ 그래서 Interface 예제를 들었다. – P0W
"WARN : operation not supported"와 같은 일을하는 기본 구현을 사용하여 비 순수 가상 인 MyInterface에서'foo'와'bar'를 만들기를 원합니다. – Ptaq666
.
사례 A : 클래스에는 주어진 메소드에 대한 정의가 있습니다. 기본 구현은 예상되는 동작을 제공해야합니다. 이 경우 당신은 자유롭게 그것을 무시할 수 있습니다.
사례 B : 메서드가 추상이므로 예상 한 방식으로 덮어 써야합니다. 그렇지 않으면 컴파일러가 컴파일되지 않습니다.
C++에서 "하나 또는 모두 덮어 씀"을 선언 할 방법이 없습니다. 주어진 클래스는 기대하는 바는 (매우) 나쁜 디자인입니다.
그래서 질문은 존재하지 않습니다. 존재하는 경우 문맥에 따라 다르므로 자세한 내용으로 대답 할 수 없습니다.
어떤 문맥에서이 수업을 사용하고 있습니까? 당신은 정교하게하고 싶을지도 모르다. 메모를 기반으로 의견을 기반으로하는 질문을 꺼내십시오 - –
클래스를 사용하여 인터페이스를 구현하려면 전체 인터페이스를 구현해야한다고 생각합니다. 특정 클래스의 공통 구현에 오버로드를 원하십니까? – ponayz
인터페이스를 2로 분할하고 각각에 하나의 메소드를 넣으십시오. 클래스는 이제 하나 또는 두 개의 인터페이스를 구현할 수 있습니다. 인터페이스는 계약으로 간주되어야합니다 (이 모든 것을 구현합니다). –