2010-12-01 6 views
0

기본 클래스 개체를 사용하여 파생 클래스의 속성 멤버에 액세스하는 데 문제가 있습니다.CSharp의 기본 클래스 개체에서 파생 클래스 속성 멤버에 액세스

시나리오 :

public class BaseClass{ 
    public virtual Write(BaseClass data){ 
    } 
} 

public class DerivedClass : BaseClass{ 

    private string name: 

    public string Name {get {return name} set {name = value;} } 

    public override Write(BaseClass data){ 
    Console.println(data.Name); // gives me error here 
    } 

} 
+2

이름이 정의되지 않습니다 것을 JSON 또는 XML 후 출력 직렬화 할 수 BaseClass에서. –

+0

그렇게 할 수는 없지만'BaseClass data'가'DerivedClass'와 같은 타입이 될 것으로 기대할 수는 없습니다. 인쇄물로 무엇을 기대합니까? –

+1

또한'Console.println'도 존재하지 않습니다. 'Console.WriteLine' 않습니다. –

답변

6

당신이 파생 클래스의 속성에 액세스 문제가있는 이유는 기본 클래스는하지 않습니다 (그리고 더 중요한 하지한다) 그들에 대해 아는 것입니다. 서로 다른 파생 클래스는 추가 된 속성 집합을 가질 수 있습니다. 이것을 인식하는 기본 클래스를 만드는 것은 객체 지향 디자인의 중요한 원칙을 방해합니다. 마음에 떠오르는 그러한 원리 중 하나는 Liskov Substitution Principle입니다.

0

앞에서 설명한대로 이름이 BaseClass에 없습니다.

"name"을 기본 클래스로 이동하거나 상속 된 클래스의 특정 데이터를 쓰는 별도의 쓰기 메서드를 만듭니다.

public class DerivedClass : BaseClass{ 

    public string Name { get; set; } 

    public override void Write(DerivedClass data) { 
     Console.printLn(data.Name); 
     base.Write(data) 
    } 

    // why print a different instance, just write self 
    public void Write() { 
     Console.printLn(this.Name); 
     base.Write(this) 
    } 

} 

왜 클래스가 자체적으로 쓰기를 호출 할 수있을 때 다른 클래스 인스턴스를 받아들이는지 확실하지 않습니다. ,

public virtual Write() 

또는 같은 WebControls

public virtual Write(HtmlTextWriter writer); 

단순히 디버깅하려는 경우에 BaseClass로의 signture 변경 당신은 당신의 콘솔에

관련 문제