2011-02-17 112 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;} 
} 

如果存在您不希望子类具有的属性,请不要将它放在基类中。