【问题标题】:Access modifier on abstract classes抽象类的访问修饰符
【发布时间】:2012-11-14 05:51:51
【问题描述】:

如果我有一个像这样的抽象类

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

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

这个受保护的访问修饰符是多余的,因为抽象不能被实例化吗?

【问题讨论】:

    标签: c# abstract-class access-modifiers


    【解决方案1】:

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

    不,绝对不是。考虑:

    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 指出 getter 和 setter 的不同保护级别。另外,请记住自动实现的属性是C# 3.0 and above
    • @MikeChristensen:不,C# 2 中引入了不同的访问级别。C# 3 引入了自动实现的属性,但这是一个不同的特性。
    【解决方案2】:

    不,抽象类中的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.
    

    【讨论】:

    • 天哪,我的赞成票比 Jon Skeet 还多,可能不会持续太久...... :)
    • 老实说,我不太明白你的意思“它使派生实现类具有”...
    • @JonSkeet。我的意思是他们使用 protected 修饰符派生了该属性,我认为从问题中可以清楚地看出。
    • 在我看来,您希望派生类重新声明该成员。成员本身仍然属于抽象类;它像平常一样被继承。似乎其他人发现你的答案比我更清楚,这很好:)
    • @JonSkeet。感谢反馈,现在清楚了吗?谢谢,非常感谢。
    【解决方案3】:
    abstract class ProgressNotesDetail
    {
    
    }
    
     internal class ProgressNotes : ProgressNotesDetail
    {
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 2013-09-18
      • 2010-09-20
      • 2018-06-26
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2014-01-02
      相关资源
      最近更新 更多