c#阻止了方法的继承

时间:2011-02-17 05:24:01

标签: c# inheritance encapsulation

对于扑克解析器(我的第一个学习c#的项目),我有一个父类clCardsHeld和两个子类clHiHandclLoHandclCardsHeld还包含两种子类型中的每一种的属性和私有字段。所以我最终得到的是这种继承,例如:

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;

(由intellisense提示)。 (HiHand不应该有另一个HiHand作为自己的属性,也不应该是低手。但CardsHeld有一个HiHandLoHand作为属性,例如,你可以获得7张牌的游戏,你可以使用5来制作尽可能最好的牌,最差的牌可以使用5次,两者同时进行,每次牌均为一半。)

我将基类字段设为私有字段而不是受保护字段,因此如果我已正确识别,则继承的属性仍为null。但我真的希望这个财产不被继承。试图研究这个,我看到只有在覆盖基本属性时才能密封属性。并且“隐藏”该方法通常是指在孩子中具有不同的代码....

另一件事,我在抛出新手问题时:

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

我可以在本地窗口中找到clCardsHeld._liCards,但我在本地窗口中找不到clCardsHeld.clHiCards._liCards(但我可以通过将其分配给变量来获取它。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

正如Adeel引用的链接中所提到的,这种情况下的继承是不必要的。你的高手和低手应该只是clCardsHeld的新实例:

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 :(得分: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;}
}

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