对于扑克解析器(我的第一个学习c#的项目),我有一个父类clCardsHeld
和两个子类clHiHand
和clLoHand
。 clCardsHeld
还包含两种子类型中的每一种的属性和私有字段。所以我最终得到的是这种继承,例如:
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
有一个HiHand
和LoHand
作为属性,例如,你可以获得7张牌的游戏,你可以使用5来制作尽可能最好的牌,最差的牌可以使用5次,两者同时进行,每次牌均为一半。)
我将基类字段设为私有字段而不是受保护字段,因此如果我已正确识别,则继承的属性仍为null
。但我真的希望这个财产不被继承。试图研究这个,我看到只有在覆盖基本属性时才能密封属性。并且“隐藏”该方法通常是指在孩子中具有不同的代码....
另一件事,我在抛出新手问题时:
public class clCardsHeld { private List<clCards> _liCards; }
public class clHiHand : clCardsHeld
我可以在本地窗口中找到clCardsHeld._liCards
,但我在本地窗口中找不到clCardsHeld.clHiCards._liCards
(但我可以通过将其分配给变量来获取它。
感谢您的帮助。
答案 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)
你的帖子中有一些误解......
我认为您应该将所有对象的常见内容拆分为单独的基类:
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;}
}
如果存在您不希望子类具有的属性,则不要将其放在基类中。