c#防止方法的继承

c#防止方法的继承,c#,inheritance,encapsulation,C#,Inheritance,Encapsulation,对于扑克解析器(我学习c#的第一个项目),我有一个父类clCardsHeld和两个子类clHiHand和clLoHandclCardsHeld还包含两个子类型的属性和私有字段。因此,我最终得到的遗产是,例如: public class clCardsHeld {public clHiHand HiHand { Get {} Set {} } } public class clHiHand : clCardsHeld{} clCardsHeld Hand3 = new clCardsHeld(

对于扑克解析器(我学习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 
public类clCardsHeld{private List}
公共类clHiHand:clCardsHeld
我可以在“局部变量”窗口中找到
clCardsHeld.\u-liCards
,但在“局部变量”窗口中找不到
clCardsHeld.clHiCards.\u-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
    }
}
公共类clCardsHeld
{
私人名单;
公共clCardsHeld GetLoHand()
{
//这里的逻辑是用低牌回击
}
公共clCardsHeld GetHiHand()
{
//这里的逻辑是使用_-liCards来回击高压
}
}

GetLoHand()和GetHiHand()函数只会返回一组不同的持有卡片。

您的帖子中有一些误解

  • 如果不希望继承某个属性,则违反了
  • 子类中的字段不能为null,因为它们是基类的私有字段。它们仍然可以由基类中的逻辑分配
  • 对我来说,这听起来像是在不需要的时候使用继承当一个概念(子类)是另一个概念(基类)的特例时使用继承,并且更喜欢组合而不是继承
我认为您应该将所有对象的公共部分拆分为一个单独的基类:

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

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

请查看此重复问题:请提供一些示例源代码。我尝试了至少两次阅读此内容,但我就是看不到。我不知道您在问什么。您能将问题的格式设置得更好一点吗?更多的空格(思考段落)代码格式也会有很大帮助。你所要做的就是在代码行中添加4个空格,它们会自动显示语法高亮显示和其他优点。我同意副本中的答案。使用合成而不是继承。感谢链接。我看到了这个链接,但没有理解它与我相关。尝试继承集合似乎与我的排序不同。我有很多代码将字符串输入解析为卡片对象和列表,这是我希望父子通用的。我想我希望能够有时实例化一个特定的5卡HiHand或LoHand。但让我考虑一下您的建议。谢谢s、 这很简单,也很合理。哦,让我澄清一个关于null的问题。我认为我的问题是试图将基类中的属性保留在派生类之外。我没有做到这一点(现在知道这是错误的想法),但我所做的是更改对“问题”后面字段的访问权限这似乎具有这样的效果:不希望继承的属性实例(“.HiCards.HiCards”)全部返回为null。这就是我的意思。更改访问修饰符不会影响字段的值。但是您可能必须注释掉或删除一些为其赋值的代码,以便在更改修饰符后使其编译。这可能是现在为null的原因。