6

私が次のような抽象クラスを持っている場合

public abstract class Player
{
    //fields
    private Sport _sport;

    //properties
    protected Sport Sport
    {
        get { return _sport; }
        set { _sport = value; }
    }      
}

抽象はインスタンス化できないため、この保護されたアクセス修飾子は冗長ですか?

4

3 に答える 3

9

抽象はインスタンス化できないため、この保護されたアクセス修飾子は冗長ですか?

いいえ、絶対にありません。検討:

Player player = new FootballPlayer();
Sport sport = player.Sport;

Sport保護されているのではなく、公共の財産として宣言されている場合、それは有効です。もちろん、それは実際にはあなたが望むものかもしれませんが、現在、派生クラス(およびPlayerそれ自体内)のコードのみがSportプロパティにアクセスできます。

ただし、プロパティ全体は、同等の自動的に実装されたプロパティとして単純になることに注意してください。

protected Sport Sport { get; set; }

または、パブリック取得を許可するが保護された設定を許可するには:

public Sport Sport { get; protected set; }
于 2012-11-26T17:40:56.073 に答える
5

いいえ、protected抽象クラスでは、派生実装クラスが「持つ」派生になるため、冗長ではありません。

protected Sport Sport

それ以外の:

public Sport Sport

privateまた、修飾子を完全に使用または削除した場合sportは、抽象クラス自体にのみ表示されます。

例えば:

public abstract class Player
{
    // Changed to auto property to save some key strokes...
    protected Sport Sport { get; set;}
}

public RealPlayer : Player
{
    public void Foo(Sport sport)
    {
        this.Sport = sport; // Valid
    }
}

他のクラスでは...

var realPlayer = new RealPlayer();
realPlayer.Sport // Compilation error.
于 2012-11-26T17:40:38.240 に答える
-2
abstract class ProgressNotesDetail
{

}

 internal class ProgressNotes : ProgressNotesDetail
{

}

抽象クラスのデフォルトのアクセス修飾子----内部

于 2017-11-21T10:47:40.537 に答える