使用父方法派生类

Baa*_*ali 3 c#

为什么我不能从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)

Jon*_*eet 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
Run Code Online (Sandbox Code Playgroud)

最后一个是无效的,因为即使在执行时它正在访问实例上的成员B,编译器也只知道ba它是类型A.

这是C#5规范3.5.3节的开头,它可以澄清一些事情:

protected在声明它的类protected internal的程序文本之外访问实例成员时,并且当在声明它的程序的程序文本之外访问实例成员时,访问必须在派生的类声明中进行.来自声明它的类.此外,需要通过该派生类类型的实例或从其构造的类类型进行访问.此限制可防止一个派生类访问protected其他派生类的成员,即使这些成员是从同一基类继承的.