2014-05-21 2 views
2

InterfaceBaseList의 메소드를 현재 인터페이스에 구현하려면 어떻게해야합니까? 예 :인터페이스 기본 목록에서 최종 인터페이스 구현을 인식하지 못합니다.

interface bar(T) 
{ 
    void method1(T a); 
    void method2(T a); 
} 

interface baz: bar!int 
{ 
    final void method1(int a){} 
} 

class foo: baz 
{ 
    this(){method1(0);} 
    void method2(int a){} 
} 

void main() 
{ 
    auto Foo = new foo; 
    Foo.method2(0); 
} 

출력 :

myfile.d(xx): Error: foo interface function 'void method1(int a)' 
is not implemented 

baz.method1 것을 얻을 나던 컴파일러가 실제로 bar.method1 것 같다. 예제에서는 baz에서 몇 가지 이유로 method1이 항상 동일한 구현을 갖는다는 것을 알 수 있습니다. 바스 구현자는 막대로 다운 캐스팅 될 수 있습니다 (바에서 최종 더미를 만드는 것은 불가능합니다).

+0

내가 얻을 다음 기본 클래스의 방법 –

+1

를 오버라이드 (override) 방법에'override'를 추가'오류 : 기능 SpecItf.baz.method1가 아닌 가상 function'의 bar.method1 가상으로 간주되지 않습니다 무시할 수 없습니다? –

+0

템플릿 방법은 일반적으로 –

답변

4

인터페이스는 구현이없는 가상 멤버 또는 구현 된 최종 멤버 만 선언 할 수 있습니다. 코드에서 비가 상 구현을 사용하여 가상 메서드를 재정의하려고합니다. 인터페이스의 특성상 실제로는 인터페이스 내의 어떤 것도 무시할 수 없습니다. 당신이 원하는 것은 추상 클래스입니다.

abstract class baz: bar!int 
{ 
    override void method1(int a){} 
} 

이 문제를 정리합니다 위의 클래스로 baz 인터페이스를 교체. (물론, 컴파일되지 않습니다!)

interface Root { 
    int foo(); 
} 

interface BranchA : Root { 
    override int foo() { return 1; } 
} 

interface BranchB : Root { 
    override int foo() { return 2; } 
} 

class C : BranchA, BranchB { } 

어떤 것 (new C()).foo() 반환 :

이 허용되지 않는 이유의 예로서

는이 코드를 고려? 결과가 모호합니다. 인터페이스와 달리 한 번에 하나의 클래스 만 상속 할 수 있기 때문에 클래스의 인터페이스 메서드를 재정의하는 것이 허용됩니다.

+0

아 나는 다이아몬드 문제를 본다. –