访问修饰符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
修饰符不允许我访问库的其他部分,所以我不能使用它。
我看到你的设计的问题不是访问修饰符,它只是根本不正确。
让Card
对象具有IsCard
属性并没有多大意义,这也是为什么Minion
对象上的IsMinion
属性也没有意义的原因。这些属性并不真正属于Card
对象。
Card
类是包含所有这些玩家类型的enum
:
public enum Card
{
Minion,
Weapon,
Spell,
// etc..
}
当你的继承层次中出现一些奇怪的东西时,比如一个公共属性不属于派生类,这通常是一个停下来思考你是如何计划的,以及为什么它们看起来不正确的信号。在OOP中,主要是创建适合问题的正确模型。
注意事项:
继承是一个"is-a"关系。Minion : Card
表示"Minion
就是Card
"。这也许是你的本意,也许不是。
您已经可以使用该语言询问对象是Card
还是Minion
或Spell
。有几种方法可以做到这一点:
使用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
对