Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建基类类型变量,并引用具有继承类类型的对象_C#_Class_Oop - Fatal编程技术网

C# 创建基类类型变量,并引用具有继承类类型的对象

C# 创建基类类型变量,并引用具有继承类类型的对象,c#,class,oop,C#,Class,Oop,我说的是主函数的第一行。当我这样创建它时:DerivedC instance=new DerivedC();对我来说一切都很清楚,我看到了这两个变量,但是为什么我在上面创建对象时看不到Y呢?“实例”变量的类型(BaseC或DerivedC)如何影响结果?这就是多态性在C#中的工作方式:在基类类型的变量中,允许存储对任何子类实例的引用,但如果选择这样做,则只能通过变量“查看”基类成员。这样做的原因是安全性:可以保证,无论变量引用什么,它都将有一个x。但是,可能存在没有y的其他子类 您可能会争辩说,

我说的是主函数的第一行。当我这样创建它时:DerivedC instance=new DerivedC();对我来说一切都很清楚,我看到了这两个变量,但是为什么我在上面创建对象时看不到Y呢?“实例”变量的类型(BaseC或DerivedC)如何影响结果?

这就是多态性在C#中的工作方式:在基类类型的变量中,允许存储对任何子类实例的引用,但如果选择这样做,则只能通过变量“查看”基类成员。这样做的原因是安全性:可以保证,无论变量引用什么,它都将有一个
x
。但是,可能存在没有
y
的其他子类

您可能会争辩说,很明显,该变量引用了一个
DerivedC
,但这只是因为这是一个简单的示例。想象一些代码,其中有一个函数将
BaseC
作为参数。该函数可以在一个位置用
DerivedC
调用,也可以在另一个位置用
DifferentDerivedC
调用,该位置没有
y
。然后,如果允许该函数访问
y

,则该函数在第二次调用中将失败。这就是多态性在C#中的工作方式:在基类类型的变量中,允许您存储对任何子类的实例的引用,但如果您选择这样做,则只能通过该变量“查看”基类成员。这样做的原因是安全性:可以保证,无论变量引用什么,它都将有一个
x
。但是,可能存在没有
y
的其他子类


您可能会争辩说,很明显,该变量引用了一个
DerivedC
,但这只是因为这是一个简单的示例。想象一些代码,其中有一个函数将
BaseC
作为参数。该函数可以在一个位置用
DerivedC
调用,也可以在另一个位置用
DifferentDerivedC
调用,该位置没有
y
。然后,如果允许该函数访问
y

,则该函数将在第二次调用中失败,因为实例的类型是BaseC,它不会公开属性y。 要访问属性y,您需要执行以下操作:

class Program
{
    static void Main(string[] args)
    {
        BaseC instance = new DerivedC();
        // I don't see Y here.
        Console.ReadLine();
    }
}

public class BaseC
{
    public int x;
}
public class DerivedC : BaseC
{
    public int y;
}

y是只能从子类访问的扩展属性。这就是继承的概念。子对象继承子对象上的属性,而不是相反。

因为实例的类型是BaseC,所以它不会公开属性y。 要访问属性y,您需要执行以下操作:

class Program
{
    static void Main(string[] args)
    {
        BaseC instance = new DerivedC();
        // I don't see Y here.
        Console.ReadLine();
    }
}

public class BaseC
{
    public int x;
}
public class DerivedC : BaseC
{
    public int y;
}
y是只能从子类访问的扩展属性。这就是继承的概念。子对象继承子对象上的属性,而不是相反