为什么我不能从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; }
}
---正如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();
}
}
答案 0 :(得分:5)
受保护意味着它可以从派生类中的代码中使用 - 它并不意味着它可以从外部使用""使用派生类时。
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
最后一个是无效的,因为即使在执行时它访问B
实例上的成员,编译器也只知道ba
为{{1}类型}}
这是C#5规范3.5.3节的开头,它可以澄清一些事情:
当在声明它的类的程序文本之外访问
A
实例成员时,以及在程序的程序文本之外访问protected
实例成员时声明,访问必须在一个类声明中发生,该声明派生自声明它的类。此外,需要访问通过该派生类类型的实例或从其构造的类类型。此限制可防止一个派生类访问其他派生类的protected internal
成员,即使成员是从同一基类继承的。