2013-08-16 4 views
1

는 "다음 코드 가정 : 나는 인쇄 할"base.base"클래스에서 메서드 호출?

public class MultiplasHerancas 
{ 
    static GrandFather grandFather = new GrandFather(); 
    static Father father = new Father(); 
    static Child child = new Child(); 

    public static void Test() 
    { 
     grandFather.WhoAreYou(); 
     father.WhoAreYou(); 
     child.WhoAreYou(); 

     GrandFather anotherGrandFather = (GrandFather)child; 
     anotherGrandFather.WhoAreYou(); // Writes "I am a child" 
    } 

} 

public class GrandFather 
{ 
    public virtual void WhoAreYou() 
    { 
     Console.WriteLine("I am a GrandFather"); 
    } 
} 

public class Father: GrandFather 
{ 
    public override void WhoAreYou() 
    { 
     Console.WriteLine("I am a Father"); 
    } 
} 

public class Child : Father 
{ 
    public override void WhoAreYou() 
    { 
     Console.WriteLine("I am a Child"); 

    } 
} 

" ". 객체

를 내가 자식 객체가에 방법을 수행 할 수있는 방법"나는 아이 "로부터"할아버지 오전베이스 .base "클래스? 기본 메서드 ("나는 아버지 "입니다.)를 인쇄 할 수는 있지만,"나는 할아버지입니다 "라고 인쇄하고 싶습니다! 이렇게 할 수있는 방법이 있다면, 그것입니까? OOP 디자인에서 권장합니까?

참고 : 저는이 방법을 사용하지 않거나 사용할 것이며, 지식 상속을 강화하려고합니다.

답변

5

이는 Method Hiding 사용 할 수 있습니다 -

public class GrandFather 
{ 
    public virtual void WhoAreYou() 
    { 
     Console.WriteLine("I am a GrandFather"); 
    } 
} 

public class Father : GrandFather 
{ 
    public new void WhoAreYou() 
    { 
     Console.WriteLine("I am a Father"); 
    } 
} 

public class Child : Father 
{ 
    public new void WhoAreYou() 
    { 
     Console.WriteLine("I am a Child");    
    } 
} 

과 같이 호출 이 - new 키워드 hides the inherited member of base class in derived class를 사용

Child child = new Child(); 
((GrandFather)child).WhoAreYou(); 

.

2

대신 "재정의"의 "새로운"키워드를 사용하고 방법에서 "가상"키워드를 제거하려고)

0

이 프로그램을 실행하면 오류가 발생합니다. 자식 개체가 부모 클래스를 참조하는지 확인한 다음 참조 유형 캐스팅 호출 메서드를 사용하십시오. 예 : 하위 자식 = 새 할아버지();/여기서 참조 부모 클래스 인 자식의 인스턴스를 만듭니다./ ((할아버지) 자식) .WhoAreYou();/* 이제 참조 유형 */ 을 사용할 수 있습니다. 그렇지 않으면 할아버지 유형 캐스팅에서 오류가 표시됩니다.