0

类---A

class ClassA
{
    public string c1()
    {
        return "Class-A";
    }

}

类---B

class ClassB:ClassA
{
    public string c2()
    {
        return "Class-B";
    }
}

主班

- - -第1部分 - - - - - - - - -

 ClassA obj1 = new ClassB();
 string a = obj1.c1();//Here i will get only c1
 Console.WriteLine(a);
 Console.ReadLine();

- - -第2部分 - - - - - - - - -

 ClassB obj1 = new ClassA();
 string a = obj1.c2();//Her i will get both c1 and c2
 Console.WriteLine(a);
 Console.ReadLine();

在第 1 部分中,我将只得到 c1。我需要知道是否在堆栈中为 ClassA 创建了变量(obj)并从堆中分配 ClassB 的地址。实际发生了什么?

在第 -2 部分中,获取(编译错误)转换错误。执行此代码时屏幕后面实际发生了什么。

谢谢,乔比库里安

4

3 回答 3

5

第1部分

ClassA obj1 = new ClassB();

这将创建一个- 对象的实例ClassB

它还声明了一个名为, 类型的变量。该变量的将始终是一个引用 - 要么是对. 在这种情况下,初始值是对新创建对象的引用。(对对象的引用也可以用作引用,因为派生自。)obj1ClassAnullClassAClassBClassBClassAClassBClassA

当您调用 时c1,它只是调用其中的实现ClassA- 但在该方法中,如果您打印出来,this.GetType()它仍会返回ClassB的类型,因为它在对象“内部”运行ClassB

我强烈建议你不要担心堆栈和堆。关注三个不同的概念

  • 对象
  • 引用(导航到对象的方式,或 null)
  • 变量(命名存储位置)

Eric Lippert 写了很多关于这类事情的博客。您可能想从The Stack Is An Implementation Detail开始。

第2部分

ClassB obj1 = new ClassA();

这将创建 的实例ClassA,并尝试将新对象的引用分配给类型的变量ClassB。那是行不通的,因为ClassA派生自. 您不能将编译时类型的引用用于 type的变量。为了说明为什么这不起作用,它有点像这样做:ClassBClassAClassB

string x = new object();
Console.WriteLine(x.Length); // What could this possibly print out?

基本上,继承不能以这种方式工作——你可以将 的实例ClassB视为ClassA(在大多数情况下)的实例,但不能将 的实例ClassA视为 的实例ClassB。您通常会在 中添加更多状态(字段)ClassB,这样信息就不会出现在ClassA.

于 2012-04-09T07:18:04.773 回答
0

发生的事情(在第二部分)是您试图将类 A 实例化为类 B 的变量。这是无法做到的,因为该变量必须具有可在实例化对象中访问的可用属性。因此,当您尝试调用方法 c2() 时,它在对象中不存在。反之亦然,因为变量的所有可用属性和方法都存在于实例化对象中。

于 2012-04-09T07:21:55.540 回答
0

您正在制作 A 类的对象并调用 B 类的构造函数,制作该特定类的对象。然后访问属性。你为什么要为你做一些有趣的事情!

于 2012-04-09T07:24:19.417 回答