2011-02-17 113 views
0

對於一個撲克解析器(我的第一個學習c#的項目),我有一個父類clCardsHeld和兩個子類clHiHandclLoHandclCardsHeld還包含兩種子類型中每一種的屬性和私有字段。還等什麼我結束了,這種繼承是,如:c#防止方法的繼承

public class clCardsHeld 
{public clHiHand HiHand { Get {} Set {} } 
} 
public class clHiHand : clCardsHeld{} 

clCardsHeld Hand3 = new clCardsHeld(); 
clHiHand hi = new clHiHand(); 
hi = Hand3.HiHand.HiHand.HiHand; 
hi = Hand3.HiHand.LoHand.HiHand; 

(如提示您通過智能感知)。 (HiHand不應該有另一個HiHand作爲其本身的財產,也不是一個低手,但CardsHeldHiHandLoHand屬性,例如,您可以獲得7張卡片的遊戲,並且您可以使用5來製作最好的手和5爲最壞的可能,兩者同時播放,每個播放一半)

我將基類字段設置爲私有的,而不是受保護的,所以繼承的屬性仍然爲null,如果我已經正確識別。但我真的希望該財產不被遺傳。試圖研究這一點,我發現一個屬性只能在覆蓋基本屬性時才能被封閉。而「隱藏」這個方法通常是指在孩子身上有不同的代碼。

的另一件事,而我扔了我的新手問題:

public class clCardsHeld { private List<clCards> _liCards; } 
public class clHiHand : clCardsHeld 

我可以找到當地人窗口clCardsHeld._liCards,但我無法找到當地人窗口clCardsHeld.clHiCards._liCards(但我可以得到它通過將其分配給一個變量。

感謝您的幫助。

+0

看到這個重複的問題:HTTP://stackoverflow.com/questions/3772321/how-to-prevent-inheritance-for-some-methods – Adeel 2011-02-17 05:26:59

+0

請提供一些示例源代碼。 – Raghu 2011-02-17 05:32:16

+2

我至少試了兩次來閱讀這個,而我卻不能。我不知道你在問什麼。你能否把你的問題格式化得更好一些?更多的空格(考慮段落)和代碼格式會幫助*很多*。你所要做的就是將你的代碼行用4個空格表示,並且它們會自動顯示語法突出顯示和其他好東西。 – 2011-02-17 05:39:56

回答

1

如在由阿迪爾引用鏈接所提到的,在這種情況下,繼承是不必要的。你的高牌和低手應該只是新實例cl CardsHeld:

public class clCardsHeld 
{ 
    private List<clCards> _liCards; 

    public clCardsHeld GetLoHand() 
    { 
     //Logic here for returning the low hand, using _liCards 
    } 

    public clCardsHeld GetHiHand() 
    { 
     //Logic here for returning the high hand, using _liCards 
    } 
} 

的GetLoHand()和GetHiHand()函數將簡單地返回一組不同的持有卡。

1

有一對夫婦在您的文章的誤解..

  • 如果你想有一個屬性不被繼承,你違反了Liskov Substitution Principle
  • 僅僅因爲它們對於基類是私有的,子類中的字段不爲空。它們仍然可以由基類中的邏輯分配。
  • 這聽起來像你在不需要時使用繼承。當一個概念(子類)是另一個概念(基類)的特例時使用繼承。並支持繼承的構成。

我想你應該分開什麼是共同的所有對象到一個單獨的基類:

class HandBase { /* common to both HiHand an LoHand */} 
class LoHand : HandBase {} 
class HiHand : HandBase {} 

從我可以從你的解釋說,cCardsHeld不必具有相同基本類型:

class CardsHeld 
{ 
    public LoHand LoHand { get; private set;} 
    public HiHand HiHand { get; private set;} 
} 

但如果這樣做,那麼你可以這樣做:

class CardsHeld : HandBase 
{ 
    public LoHand LoHand { get; private set;} 
    public HiHand HiHand { get; private set;} 
} 

如果存在您不希望子類具有的屬性,請不要將它放在基類中。