2012-04-29 94 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; } 

有沒有實現這一點的方法嗎?

編輯: 爲了使問題更清晰

我目前有IF-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 

現在我想刪除所有的冗餘代碼,使一個巨大的函數可以處理所有這些。

+0

我已經回答最好,我可以給粗略的信息 - 如果你可以給你更多的上下文關於你想達到什麼,那真的會有所幫助。 – 2012-04-29 08:09:41

+1

你如何使用關鍵字ref作爲變量參數? – 2012-04-29 08:12:12

+0

@DarrenDavies編輯問題 – 2012-04-29 08:16:21

回答

4

如果所有子類必須具有的屬性(但具有不同的實現),應聲明它們作爲在基類(Parent)摘要屬性,然後在子類中實現它們。

如果一些派生類不會有這些屬性,那麼你會希望你的當前GetProps辦?

編輯:如果您使用C#4你絕對不能得到較好的類設計(其中父類聲明的屬性),你可以使用動態類型:

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

我ð把它當作雖然不得已......

+0

對不起喬恩,我不是一個好作家,但是我在我的問題中增加了更多細節。此外,我正在訪問此外部DLL,我沒有訪問來源。 – 2012-04-29 08:17:07

+0

@KevinBoyd:我懷疑這個子類是否有'override',除非這個屬性實際上是在基類中的。如果你可以給一個簡短的*完整的*例子,那真的會有所幫助。 – 2012-04-29 08:19:29

+0

喬恩,繼承線很長。並且我使用了父級父級的引用,例如Parent ---> SubP10 ----> SubP9 ---> SubP8 ...-> Child。任何父母可能擁有prop1的定義。 – 2012-04-29 08:27:31

0

如果物業在父母和孩子之間的中間類定義的,您不必在設計時即中間類的引用,那麼你可以使用反射來獲取財產。但是這聽起來像你應該使用最相關的子父代,而不是簡單的父代。

+0

好主意!一個例子雖然有幫助!喬恩提到的反思和動態似乎是現有的選擇。 – 2012-04-29 09:25:29

1

正如我從你的問題所理解的,你想從父類的對象訪問子類成員。

OOP中不允許此行爲。 Jon Skeet建議創建Abstract基類並在Children Classes中實現所需的成員。

其他方式輪可以是爲所需的值分配給使用鹼構建在派生類構造基類的成員。我不知道這會解決你的問題。但是,例如,考慮下面的代碼片段:

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,感謝您的解釋,但在這種情況下,我正在訪問一個外部庫,無法修改源代碼。另外我想從父引用訪問子屬性。進來的對象仍然是子對象。 – 2012-04-29 09:02:44

0

如果我理解正確的話,你( - 我假設Parent是一個基類,Child0Child1等繼承。) - 你只是缺少prop1父的聲明。它不會阻礙,它會被簡單地覆蓋。

查看此示例(返回「子字符串」)並注意child傳遞給期望ParentClass實例的方法。

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"; } } 
}