抽象类的访问修饰符

时间:2012-11-26 17:39:13

标签: c# abstract-class access-modifiers

如果我有一个像

这样的抽象类
public abstract class Player
{
    //fields
    private Sport _sport;

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

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

3 个答案:

答案 0 :(得分:8)

  

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

不,绝对没有。考虑:

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

如果Sport被声明为公共财产而不是受保护,那么这将是有效的。当然,这可能实际上是您想要的,但目前只有派生类中的代码(以及Player内部的代码)才能访问Sport属性。

请注意,您的整个属性可以更简单,只有automatically implemented property

protected Sport Sport { get; set; }

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

public Sport Sport { get; protected set; }

答案 1 :(得分:5)

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

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.

答案 2 :(得分:-2)

abstract class ProgressNotesDetail
{

}

 internal class ProgressNotes : ProgressNotesDetail
{

}

抽象类中的默认访问修饰符----内部