2017-02-16 3 views
1

C#에서는 가상 메서드 추상을 표시하여 상속 된 클래스가이를 구현하도록 할 수 있습니다.추상 오버라이드로 선언 된 기본 메서드를 호출하는 방법

class A 
{ 
    public virtual void Method() 
    { 
     Console.WriteLine("A method call"); 
    } 
} 

abstract class B : A 
{ 
    // Class inherited from B are forced to implement Method. 
    public abstract override void Method(); 
} 

내가 B로부터 상속 된 클래스에서 MethodA 구현을 호출하고 싶습니다.

class C : B 
{ 
    public override void Method() 
    { 
     // I would like to call A implementation of Method like this: 
     // base.base.Method(); 
    } 
} 

가장 좋은 방법은 구현에서 "MethodCore"라는 보호 된 메서드를 추가하고 필요할 때 호출하는 것입니다.

class A 
{ 
    public virtual void Method() 
    { 
     MethodCore(); 
    } 

    protected void MethodCore() 
    { 
     Console.WriteLine("A method call"); 
    } 
} 

abstract class B : A 
{ 
    public abstract override void Method(); 
} 

class C : B 
{ 
    public override void Method() 
    { 
     MethodCore(); 
    } 
} 

다른 방법이 있습니까?

답변

1

가장 좋은 방법은 구현에서 "MethodCore"라는 보호 된 메서드를 추가하고 필요할 때 호출하는 것입니다.

예. base을 사용하여 abstract 메소드를 호출 할 수 없기 때문에 가능한 모든 해결책은 A 인스턴스를 사용하여 A에서 Method을 호출해야합니다. 말했다

, 그것은 당신이 BMethod기본 구현을 제공하는 방법을 찾고있는 것처럼 보이는 등 단순히 A에 구현 선물을 사용하는 메소드를 구현하지 않는 B의 서브 클래스입니다. 더 좋은 해결책은 Method을 으로 표시하고 B으로 표시하지 않는 것입니다. 대신, base.Method()

abstract class B : A { 
// Class inherited from B are forced to implement Method. 
    public virtual void Method() { 
     base.Method()//calls Method in A 
    } 
} 

이 방법을 사용하여 AMethod-B 리디렉션에 Method을 호출하고 싶어 B의 서브 클래스는 MethodA에서 단순히 base.Method()을 말할 수있다.

+0

물론 특정 구현을 원한다면 그냥 제공해야합니다. 그러나 나는 "구현을 제공해야한다"라는 이점을 느낀다. – Orace

+0

@Orace 불행히도, 부모 클래스의 메소드는 동시에 구현할 수있는 선택적이고 필수적 일 수 없다. – CKing

관련 문제