C# 客观性与继承性

C# 客观性与继承性,c#,C#,通常,protected告诉我们继承类可以访问该元素 在这种情况下,为什么该方法在Y类对象中不可见 它仅在public class Program { class X { // protected / public protected void GetX() { Console.WriteLine("X"); } } class Y : X { }

通常,
protected
告诉我们继承类可以访问该元素

在这种情况下,为什么该方法在
Y
类对象中不可见

它仅在
public

class Program
{
    class X
    {
        // protected / public
        protected void GetX()
        {
            Console.WriteLine("X");
        }
    }

    class Y : X
    {

    }

    static void Main(string[] args)
    {
        var y = new Y();
        y.GetX(); // Not work

        Console.ReadKey();
    }
}

protected
仅表示“对所有派生类可见”。嵌套在另一个类中的类不会向包含它的类提供其受保护的成员。从继承的角度来看,嵌套类对任何成员的可访问性都没有任何影响

话虽如此,您的
程序
-类与您的
Y
-类完全无关,因此只能访问其公共成员
Y
当然可以从
X
访问
受保护的
meber


编辑:您可以使用
internal
来指示您的成员应该对同一程序集中的所有类型可见(因此对
程序也可见),而不管它们与
X

的继承关系如何。您只能访问派生类中的方法。您正在尝试的是创建类(Y)的实例并访问受保护的方法。那是不可能的。这里有一个例子

class Program
{
    class X
    {
        // protected / public
        internal void GetX()
        {
            Console.WriteLine("X");
        }
        protected void GetZ()
        {
            Console.WriteLine("Z");
        }
    }
    class Y : X
    {
        public void GetXZ()
        {
            GetX();// within class, I can access Internal method from base class. 
            GetZ();// within class, I can access Protected method from base class. 
        }
    }
    static void Main(string[] args)
    {
        var y = new Y();
        y.GetX(); // Works
        y.GetZ(); //Does Not Work (Protected method, can't be accessed outside of a derived class)
        y.GetXZ();// Works

        Console.ReadKey();
    }
}

因为只有
Y
继承
X
<代码>程序
没有。您应该再次阅读文档中的关键字。
GetX
Y
中可见,但是您从外部调用它如果我想从继承对象中的父对象调用方法,我是否总是必须将其设置为
public
?@ImpoUserC:如果您想从类外部(从“使用代码”)调用方法,那么是,这种方法必须是公开的。如果您想从类内部调用该方法,那么它就不会。如果我正确理解您的意图,您也可以将该方法设置为
internal
,以便可以从同一项目中的其他代码在类外部调用它,但无法从项目外部访问它。