2012-04-29 4 views
1
public void GetProps(Parent p){ 

    // want to access lots of child properties here 
    string childProp1 = p.prop1; 
    bool childProp2 = p.prop2; 
    bool childProp3 = p.prop3; 

} 

그러나 컴파일러는C#, 부모 참조에서 하위 속성에 액세스 하시겠습니까?

기능은 클래스 학부모의 다른 아형에 걸릴 것 "부모가 정의 prop1가 포함되어 있지 않습니다"고 불평.

모든 서브 클래스는이

public override string prop1 { get; set; } 

이 달성의 방법이 있나요?

편집 : 만들기 위해 질문을 명확

I 전류가 나는 모든 중복 코드를 제거하고 일을하기를 원한다면-ELSEIF 지금

if(p is Child0){ 
     Child0 ch = p as Child0; 

     // want to access lots of child properties here 
     string childProp1 = ch.prop1; 
     bool childProp2 = ch.prop2; 
     bool childProp3 = ch.prop3; 

}else if(p is Child1){ 
     Child1 ch = p as Child1; 

     // want to access lots of child properties here 
     string childProp1 = ch.prop1; 
     bool childProp2 = ch.prop2; 
     bool childProp3 = ch.prop3; 

}else if(...// and many more 

같은 것을 할 거대한 이 모든 것을 처리 할 수있는 함수. 기본 클래스 (Parent)에서 추상적 속성, 다음 하위 클래스에서이를 구현으로

+0

나는 스케치 정보를 제공 할 수있는대로 최선을 다했습니다. 달성하고자하는 것에 대해 더 많은 맥락을 부여하면 도움이 될 것입니다. –

+1

변수 매개 변수로 키워드 ref를 어떻게 사용하고 있습니까? –

+0

@DarrenDavies 질문에 의해 편집 됨 –

답변

4

모든 아이 클래스 (하지만 서로 다른 구현과) 특성을 가질 필요가 경우이를 선언해야합니다.

일부 파생 된 클래스에 이러한 속성이없는 경우 현재 GetProps에 어떤 기능을 제공하겠습니까?

편집 : 당신은 C# 4를 사용하고 당신은 확실히 더 나은 수준의 디자인을 얻을 수 (부모 클래스의 속성을 선언하는 경우) 동적 타이핑 사용할 수있는 경우 나 '

public void GetProps(Parent p) { 
    dynamic d = p; 
    string childProp1 = d.prop1; 
    bool childProp2 = d.prop2; 
    bool childProp3 = d.prop3; 
    // ...  
} 

을 d는 이것을 최후의 수단으로 취급합니다 ...

+0

미안 존, 나는 좋은 작가가 아니지만 내 질문에 더 많은 세부 사항을 추가했습니다. 또한 외부 dll에 액세스하고있어 소스에 액세스 할 수 없습니다. –

+0

@KevinBoyd : 속성이 실제로 기본 클래스에 있지 않는 한 하위 클래스에'override'가 있을지 의심 스럽습니다. 짧지 만 완전한 * 예제를 줄 수 있다면 정말 도움이 될 것입니다. –

+0

Jon, 상속 라인이 상당히 길다. 예를 들어 Parent ---> SubP10 ----> SubP9 ---> SubP8 ...-----> Child와 같은 최상위 상위 참조를 사용하고 있습니다. 부모 중 누구라도 prop1의 정의를 가질 수 있습니다. –

0

속성이 부모와 자식 사이의 중간 클래스에 정의되어 있고 디자인 타임에 해당 중간 클래스에 대한 참조가없는 경우 리플렉션을 사용하여 재산. 그러나 단순히 부모가 아닌 가장 관련있는 하위 부모를 사용해야하는 것 같습니다.

+0

좋은 생각! 예를 들어 도움이 될 것입니다! Jon으로서의 리플렉션 및 다이내믹은 기존 옵션 인 것 같습니다. –

1

나는 당신의 질문에서, 당신은 부모 클래스의 개체에서 어린이 클래스 회원에 액세스하려는 이해했습니다.

이 동작은 OOP에서 허용되지 않습니다. Jon Skeet이 추상 기본 클래스를 만들고 Children 클래스에 필요한 멤버를 구현하도록 제안하는 한 가지 방법이 있습니다.

다른 방법은 기본 구문을 사용하여 파생 클래스 생성자의 기본 클래스 멤버에게 필요한 값을 할당하는 것일 수 있습니다. 나는 이것이 당신의 문제를 해결할 것인지 아닌지를 모른다.

public class BaseClass 
{ 
    public string FirstName = "Base Class"; 
    public string LastName = "Base Class"; 
} 

public class DerivedClass : BaseClass 
{ 
    public DerivedClass() 
    { 
     base.LastName = "Derived Class"; 
    } 
} 

internal class Tester 
{ 
    private static void Main(string[] args) 
    { 
     BaseClass objBaseClass = new BaseClass(); 
     Console.WriteLine("First Name : " + objBaseClass.FirstName); 
     Console.WriteLine("Last Name : " + objBaseClass.LastName); 

     DerivedClass objDerivedClass = new DerivedClass(); 
     Console.WriteLine("First Name : " + objDerivedClass.FirstName); 
     Console.WriteLine("Last Name : " + objDerivedClass.LastName); 

     BaseClass objBaseDerivedClass = new DerivedClass(); 
     Console.WriteLine("First Name : " + objBaseDerivedClass.FirstName); 
     Console.WriteLine("Last Name : " + objBaseDerivedClass.LastName); 

     Console.ReadKey(); 
    } 
} 
이 이

가 O는/P 이름 : 기본 클래스가

이 이 이

성 : 기본 클래스가

이 이

이름 : 기본 클래스

성 : 파생 그러나 예를 들어, 다음 코드를 고려 등급

이름 : 자료실

성 : 파생 클래스

도와 주시면 알려주세요. 내가 제대로 이해하면

+0

Pank, 설명해 주셔서 감사합니다. 그러나이 경우에는 외부 라이브러리에 액세스하고 있으며 소스를 수정할 수있는 권한이 없습니다. 또한 부모 참조에서 하위 속성에 액세스하려고합니다. 들어오는 객체는 여전히 자식 객체입니다. –

0

(- 나는 Parent 있으리라 믿고있어이 Child0Child1 등이 상속되는 기본 클래스입니다.) - 당신은 단지 부모의 prop1의 선언을 놓치고있어. 그것은 방해가되지 않을 것이며, 단순히 재정의 될 것입니다.

"자식 문자열"을 반환하는이 예제를 확인하고 ParentClass 인스턴스가 필요한 메서드에 child이 전달된다는 것을 확인하십시오.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     ChildClass child = new ChildClass(); 
     Text = ParentClass.mymethod(child); 
    } 
} 

class ParentClass 
{ 
    public virtual string s { get { return "parent string"; } } 

    public static string mymethod(ParentClass parent) 
    { 
     return parent.s; 
    } 
} 

class ChildClass : ParentClass 
{ 
    public override string s { get { return "child string"; } } 
} 
관련 문제