2012-12-05 3 views
3

나는 그것이 엉성한 디자인이라는 것을 알고 있습니다. 코드를 정밀 검사하는 게 게으르다는 것이 아니라 지름길을 택할 것입니다.C에서 슈퍼의 슈퍼를 호출하는 방법이 있나요

class Grandma 
{ 
    public virtual void Mtd(){} 
} 

class Mommy : Grandma 
{ 
    public override void Mtd(){ base.Mtd(); /* other stuff I wanna skip*/} 
} 

class Daughter : Mommy 
{ 
    public override void Mtd(){ /*base.base.Mtd() //How can I do it ? */} 
} 

가상 업 캐스팅이 작동하지 않으므로. 그래서, 심지어 그것이 가능한가?

+0

가능한 중복 [base.base.method()를 호출하는 방법?] (HTTP : // 유래 .com/questions/2323401/how-to-call-base-base-method) –

답변

3

Mommy 무시를 건너 뛸 수 없습니다. 어떻게 든 리팩터링해야합니다.

4

불가능합니다. 바로 가기를 수행하려는 경우, 당신은 당신의 Mommy 방법 내에서 유형 검사를 추가 할 수 있습니다

class Mommy : Grandma 
{ 
    public override void Mtd() 
    { 
     base.Mtd(); // calls `Grandma` implementation 

     if (this.GetType() == typeof(Mommy)) 
     { 
      // not executed for any derived class 
     } 

     if (!(this is Daughter)) 
     { 
      // not executed for `Daughter` 
     } 
    }   
} 

class Daughter : Mommy 
{ 
    public override void Mtd() 
    { 
     base.Mtd(); // calls `Mommy` implementation 
    } 
} 
+1

그러나 엄마 클래스가 Daughter 클래스와 밀접하게 연결되어 있다고 생각합니다. 이것은 나쁜 습관이라고 생각합니다.) – Need4Steed

+0

대체 체크를했습니다. 'Daughter'뿐만 아니라 모든 파생 된 클래스를 제외시키는'this.GetType() == typeof (Mommy)'도 있습니다. 물론, 이것은 당신이 요청한 것처럼 "해킹"입니다. 적절한 솔루션은 아마도 부울 매개 변수를 도입하거나 메소드 계층을 분할하여 코드를 리팩터링하는 것입니다. – Douglas

관련 문제