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)
这个受保护的访问修饰符是多余的,因为抽象无法实例化?
这是受保护的访问修饰符还原剂,因为抽象无法实例化吗?
不,绝对不是.考虑:
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)
不,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)