繁体   English   中英

c#阻止了方法的继承

[英]c# preventing inheritance of a method

对于扑克解析器(我的第一个学习c#的项目),我有一个父类clCardsHeld和两个子类clHiHandclLoHand 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有一个HiHandLoHand作为属性,例如,你获得7张牌的游戏,你可以使用5来制作最好的牌和5为最坏的可能,两者同时播放,每个锅的一半。)

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

另外一件事,当我抛弃我的新手问题时:

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

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

谢谢你的帮助。

正如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()函数将只返回一组不同的持卡。

您的帖子中有一些误解。

  • 如果您想要一个不被继承的财产,那么您违反了Liskov替代原则
  • 字段在子类中不为空,因为它们对基类是私有的。 它们仍然可以由基类中的逻辑分配。
  • 听起来像你在不需要时使用继承。当一个概念(子类)是另一个概念(基类)的特例时,使用继承。 并且赞成合成而不是继承。

我认为你应该将所有对象的共同点分成一个单独的基类:

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;}
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM