访问修饰符c#

本文关键字:访问 | 更新日期: 2023-09-27 18:14:57

我有一个类Card,它有一些属性,从外部API获得它们的值:

public bool IsCard { get { return this._isCard; } }
public bool IsSpell { get { return this._isSpell; } }
public bool IsMinion { get { return this._isMinion; } }
public bool IsWeapon { get { return this._isWeapon; } }
public bool IsPower { get { return this._isPower; } }
public bool IsPlayer { get { return this._isPlayer; } }
public bool IsGame { get { return this._isGame; } }
public bool IsHero { get { return this._isHero; } }

所以这就像我所有卡牌的主班,包括武器,法术和小黄人。(当然,真正的类有更多的成员。)

然后我有一个继承自Card (Minion : Card)的Minion

我面临的问题是,显然我可以从Minion访问这些成员(因为它们是公共的),这甚至没有意义(Minion.IsPlayer ?显然不是)所以我的问题是:我怎么能让这些成员只为Card类,而不是为它的孩子?

private修饰符不允许我访问库的其他部分,所以我不能使用它。

访问修饰符c#

我看到你的设计的问题不是访问修饰符,它只是根本不正确。

Card对象具有IsCard属性并没有多大意义,这也是为什么Minion对象上的IsMinion属性也没有意义的原因。这些属性并不真正属于Card对象。

我建议你重新考虑你的设计。看起来好像这个Card类是包含所有这些玩家类型的enum:
public enum Card
{
   Minion,
   Weapon,
   Spell,
   // etc..
 }

当你的继承层次中出现一些奇怪的东西时,比如一个公共属性不属于派生类,这通常是一个停下来思考你是如何计划的,以及为什么它们看起来不正确的信号。在OOP中,主要是创建适合问题的正确模型。

注意事项:

继承是一个"is-a"关系。Minion : Card表示"Minion就是Card"。这也许是你的本意,也许不是。

您已经可以使用该语言询问对象是Card还是MinionSpell。有几种方法可以做到这一点:

使用is关键字:(link)

if (myObject is Spell)

比较Type s: (Type typeof)

if (myObject.GetType() == typeof(Spell))

使用IsAssignableFrom方法(link):

if (typeof(Spell).IsAssignableFrom(myObject.GetType()))

如果我正确地遵循您的问题,我认为您要做的是使您的Card类成为接口。然后让Minion从该接口继承。这将使您能够更好地控制值是什么,同时能够在派生类之间控制它们。

对不起,如果我没有说正确的事情,但这些答案都没有帮助。问题出在访问修饰符上,这些属性的所有值都来自外部程序,所以这并不容易。

解决了我的问题,使用internal关键字,使其仅从程序集中可见。

制作基于界面的设计。根据你的需要执行它们。我知道你已经解决了你的问题。但是,我的建议是当你有时间的时候重新考虑一下设计。

这个网站可能会帮助你更好地掌握OOP sourcemaking.com