为什么我不能从A级或B级访问年龄方法?我以为因为它是受保护的方法,派生类实例应该能够使用它吗?
class Program
{
public static void Main(string[] args)
{
}
public static void Test(A test)
{
A a = new A();
B b = new B();
Console.WriteLine(a.Age());
Console.WriteLine(b.Age());
}
}
public class A
{
public virtual string Name { get { return "TestA"; } }
protected string Age() { return "25";}
}
public class B : A
{
public override string Name { get { return "TestB"; } }
public string Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
---正如Jon Skeet所说 -
public class B : A
{
public override string Name { get { return "TestB"; } }
public string Address { get; set; }
public void Testing()
{
B a = new B();
a.Age();
}
}
Run Code Online (Sandbox Code Playgroud)
受保护意味着它可以从派生类中的代码中使用 - 这并不意味着它可以在使用派生类时"从外部"使用.
所述protected改性剂可以是有些麻烦,因为即使一个派生类可以通过只(进一步派生类或)它自己的类的实例访问受保护的部件.
所以在B的代码中,你可以写:
A a = new A();
Console.WriteLine(a.Age()); // Invalid - not an instance of B
B b = new B();
Console.WriteLine(b.Age()); // Valid - an instance of B
A ba = b;
Console.WriteLine(ba.Age()); // Invalid
Run Code Online (Sandbox Code Playgroud)
最后一个是无效的,因为即使在执行时它正在访问实例上的成员B,编译器也只知道ba它是类型A.
这是C#5规范3.5.3节的开头,它可以澄清一些事情:
当
protected在声明它的类protected internal的程序文本之外访问实例成员时,并且当在声明它的程序的程序文本之外访问实例成员时,访问必须在派生的类声明中进行.来自声明它的类.此外,需要通过该派生类类型的实例或从其构造的类类型进行访问.此限制可防止一个派生类访问protected其他派生类的成员,即使这些成员是从同一基类继承的.