使用父方法派生类

时间:2017-07-11 05:44:21

标签: 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; }
}

---正如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();
    }
}

1 个答案:

答案 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成员,即使成员是从同一基类继承的。