访问修饰符C#

时间:2014-07-27 03:05:53

标签: c# .net

我有一个类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; } }

所以这就像我的所有牌的大师班,包括武器,法术和奴才。 (当然,真正的班级有更多的成员。)

然后我有一个Minion类继承自CardMinion : Card

我面临的问题是,显然我可以通过Minion访问这些成员(因为他们已经公开了),这甚至没有意义(Minion.IsPlayer?所以我的问题是:我怎样才能让这些成员只为Card课而不是为了孩子?

private修饰符后来无法授予我访问库中其他部分的权限,因此我无法使用它。

5 个答案:

答案 0 :(得分:5)

我在设计中看到的问题不是访问修饰符,只是不正确。

拥有Card属性的IsCard对象并不是很有意义,这也是IsMinion Minion属性的原因对象也没有意义。这些属性并非真正属于Card对象。

我建议重新考虑你的设计。看起来这个Card类是enum,包含所有这些玩家类型:

public enum Card
{
   Minion,
   Weapon,
   Spell,
   // etc..
 }

当您的继承层次结构中出现某些特殊情况(例如不属于派生类的公共属性)时,通常会停止并思考您如何计划事情以及为什么它们看起来不正确。在OOP中,它有很多关于创建适合问题的正确模型。

答案 1 :(得分:3)

有些注意事项:

继承是一种“是-a”的关系。 Minion : Card表示“MinionCard”。这可能是您的意图,也可能不是。

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

使用is关键字:(link

if (myObject is Spell)

比较Type :( Type typeof

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

使用IsAssignableFrom方法(link):

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

答案 2 :(得分:2)

如果我正确地关注了您的问题,我认为您想要做的就是让您的Card课程成为一个界面。然后从该接口继承Minion。这将使您能够更好地控制值,同时能够在派生类之间控制它们。

答案 3 :(得分:0)

很抱歉,如果我没有正确说出来,但这些答案都没有帮助。问题是访问修饰符,这些属性的所有值都来自外部程序,所以它并不那么容易。

使用internal关键字解决了我的问题,只能从程序集中看到它。

答案 4 :(得分:0)

制作基于界面的设计。根据您的需要实施它们。我知道你解决了你的问题..但是,我的建议是在你有时间的时候重新考虑设计。

此网站可能会帮助您更好地掌握OOP sourcemaking.com

问候

相关问题