抽象类的访问修饰符

use*_*862 5 c# abstract-class access-modifiers

如果我有一个抽象类

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

    //properties
    protected Sport Sport
    {
        get { return _sport; }
        set { _sport = value; }
    }      
}
Run Code Online (Sandbox Code Playgroud)

这个受保护的访问修饰符是多余的,因为抽象无法实例化?

Jon*_*eet 8

这是受保护的访问修饰符还原剂,因为抽象无法实例化吗?

不,绝对不是.考虑:

Player player = new FootballPlayer();
Sport sport = player.Sport;
Run Code Online (Sandbox Code Playgroud)

如果Sport被宣布为公共财产而不是受保护,那将是有效的.当然,这实际上可能就是你想要的,但目前只有派生类中的代码(并且在Player其自身内)才能访问Sport属性.

请注意,作为等效的自动实现属性,您的整个属性将更简单:

protected Sport Sport { get; set; }
Run Code Online (Sandbox Code Playgroud)

或者允许公众获得但受保护的设置:

public Sport Sport { get; protected set; }
Run Code Online (Sandbox Code Playgroud)

  • `+ 1`用于指出getter和setter上不同的保护级别.另外,请记住自动实现的属性是[C#3.0及以上](http://msdn.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic22). (2认同)

gdo*_*ica 5

不,protected在抽象类中不是多余的,因为它使派生实现类"拥有"-derive:

protected Sport Sport
Run Code Online (Sandbox Code Playgroud)

代替:

public Sport Sport
Run Code Online (Sandbox Code Playgroud)

如果您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
    }
}
Run Code Online (Sandbox Code Playgroud)

在其他一些班级......

var realPlayer = new RealPlayer();
realPlayer.Sport // Compilation error.
Run Code Online (Sandbox Code Playgroud)

  • 神圣的废话我比Jon Skeet有更多的赞成,可能不会很久...... :) (2认同)