c#防止方法的继承
对于扑克解析器(我学习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(
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的原因。