簡體   English   中英

訪問修飾符C#

[英]Access modifiers C#

我有一個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類( Minion : Card

我面臨的問題是,顯然我可以從Minion訪問這些成員(因為它們是公共的),甚至沒有任何意義( Minion.IsPlayer嗎?顯然不是),所以我的問題是:我如何保留這些成員僅適用於Card類而不適用於其子級?

private修飾符稍后不會授予我在該庫其他部分的訪問權限,因此我無法使用它。

我在您的設計中看到的問題不是訪問修飾符,只是根本不正確。

擁有具有IsCard屬性的Card對象沒有太大意義,這也是為什么Minion對象上的IsMinion屬性也沒有意義的原因。 這些屬性實際上並不屬於Card對象。

我建議重新考慮您的設計。 好像這個Card類是一個包含所有那些玩家類型的enum

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

當某些事情在繼承層次結構中看起來很特殊,例如不屬於派生類的公共財產時,通常這是一個停止的跡象,並考慮您如何計划事物以及它們為何看起來不正確。 在OOP中,大量關於創建適合問題的模型的問題。

注意事項:

繼承是“是”關系。 Minion : Card意思是“ MinionCard ”。 這可能不是您的意圖。

您已經可以使用該語言詢問對象是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

問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM