2013-06-18 89 views
2

我有一個包含字符串('名稱')和特徵字典('特徵')的類。 實例通過在文件中查找名稱並從中拉出特徵來構造。 我在代碼的其他地方添加了額外的功能。 我想知道的是,是否有可能在子構造函數中使用父對象的實例?在子構​​造函數中使用基礎對象(C#)

E.g.

public parentClass(string name) 
{ 
    this.name = name 
    this.features = ... gets features from file ... 
} 

public childClass(parentClass parentObject, feature extraFeatureValue) 
{ 
    childObject = parentObject??? 
    this.features[extraFeature] = extraFeatureValue 
} 

我假設我應該
一)有與額外的功能對象的新類,所以我可以告訴哪個是哪個
b)作出新的類舊的孩子,因爲這只是一些額外的功能,我想保持方法

感謝

回答

0

前面的回答(現已刪除)是我一直在尋找:「拷貝構造函數」是可能的,這需要作爲參數相同類型的另一個對象。

http://msdn.microsoft.com/en-us/library/ms173116(v=vs.80).aspx

因此我可以添加其中的一個父類,然後在子類擴展:

public Animal(Animal previousAnimal) 
{ 
    this.name = previousAnimal.name; 
    this.features = previousAnimal.features; 
} 

public Fish(parentClass animal, bool isSaltwater) 
    : base(parentClass animal) 
{ 
    this.features[SaltWaterFish] = isSaltwater; 
} 
5

我想知道的是什麼,是否有可能使用 父對象的實例在利弊爲孩子的臨時工?

是的,你可以。使用base關鍵字。另外請注意,您不需要將父實例傳遞給子構造函數。如果您創建新的Child實例,則會隱式地調用父級的默認構造函數。如果您想調用基類的自定義構造函數,請在您的子構造函數中調用基類構造函數。就像下面的例子。

您還可以閱讀更多關於MSDN中的構造函數。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Parent p = new Child(); 
    } 
} 

class Parent 
{ 
    public Parent() 
    { 
     SomeBaseProp = "BaseProperty"; 
    } 

    public Parent(string name) 
    { 
     SomeBaseProp = name; 
    } 
    public string SomeBaseProp { get; set; } 
} 

class Child : Parent 
{ 
    public Child() 
    { 
     Console.WriteLine(base.SomeBaseProp); 
    } 

    public Child(string someString) : base(someString) 
    { } //this will call the custom constructor of your base class before constructing this child class 

    public int SomeChildProp { get; set; } 
} 
+0

我不想調用父類的構造函數;我想傳入一個已經構建的父對象作爲參數。 以前的答案提到'複製構造函數',這是我不知道存在的;它現在似乎已被刪除,但這是我正在尋找的答案。 雖然謝謝。 – Ollyver

0

從您的代碼,看來你是問如何使用您的父類的構造從子類?

可以調用構造函數的基礎是這樣的:

public ChildClass(string name, Feature extraFeature) 
:base(name) //this initializes this class with the constructor of the base class 
{ 
    Features.Add(extraFeature); //this adds your extraFeature to the features-list. 
} 

allthough,我也很難完全明白你的問題。例如;如果這個額外的功能必須傳遞給ChildClass的構造函數,那麼給父類添加一個AddFeature方法會不會更好?

或者ChildClass有額外的功能總是相同的,在這種情況下,它不需要作爲構造函數參數?

是名稱參數類的名稱,功能列表實際上只是調用的方法列表?如果是這樣;你有沒有考慮過使用反射?

編輯;我接受你的情況:

public class FeatureObject 
{ 
    public String Name { get; private set; } 
    public Dictionary<String,String> Features { get; private set; } 


    public FeatureObject (string name) 
    { 
     Name = name; 
     Features = new Dictionary<String, String>(); 
     Features.Add("Name",name);//just an example of a feature that all objects have 
    } 
} 

public class Fish: FeatureObject 
{ 
    public Color Color { get; private set; } 

    public Fish(String name, Color color) 
    :base(name) //initializes Name and Features as described in FeatureObject-class 
    { 
     Features.Add("Color", color.ToString());//Adds color to the features-dictionary 
    } 
} 

我仍然認爲你可以做到這一點更容易。

例如,這種方法將嘗試在一個對象返回指定屬性的字符串表示:

public static String GetPropertyValue(object o, String property) 
{ 
    try 
    { 
     return o.GetType().GetProperty(property).GetValue(o, null).ToString(); 
    } 
    catch(Exception) 
    { 
     return null; 
    } 
} 

,如果你有一個字典對象你的對象,你可以在這樣的方法獲取它們:

public static String GetPropertyValue(String objectName, String propertyName) 
{ 
    try 
    { 
     var o = Objects[objectName]; 
     return GetPropertyValue(o, propertyName) 
    } 
    catch (Exception) 
    { 
     return null; 
    } 
} 
+0

謝謝你的建議。 name參數是對象的名稱 - 讓我們說'fish' - 並且這些特徵可以是像'size','color'之類的東西。 (所以功能是一個字典)。 因此,額外的功能總是相同的功能,但可能會採取不同的值。 由於要素列表是靜態的,因此我希望爲具有標準要素列表的對象和具有擴展列表的對象設置不同的類。 這似乎是一種合理的方式來構建它嗎? – Ollyver

+0

(對列表和詞典的混淆抱歉 - 我在頭腦中清楚地使用了'list'的非編程定義,這沒有幫助。) – Ollyver

相關問題