0
namespace test
{
    class testclass1
    {

        public virtual void test()
        {
            Console.WriteLine("Parent class");
        }
    }
}

namespace test 
{
    class Program : testclass1
    {
        public override void test()
        {
            Console.WriteLine("Child class");
        }
        static void Main(string[] args)
        {
            Program t = new Program();
            t.test();
            Console.ReadLine();
        }
    }
}

使用 Program t = new Program()答案是“儿童班”,同时使用 testclass1 t = new Program()答案也是一样的!

那么这两个初始化之间的确切区别是什么?

4

2 回答 2

2

您正在分配nott的实例,因此它将始终调用该方法的实现,因为它是派生类并且覆盖了基方法。ProgramTestClassProgram

public class Base
{
  //I am virtual, this means that I can be overriden
  public virtual void MethodA()
  {
    Console.WriteLine("Hello, From Base");
  }
}
public class Derived : Base
{
  //I am Base, but with other stuff.

  //I am going to do something else with MethodA
  public override void MethodA()
  {
    Console.WriteLine("Hello, From Derived");
  }
}

你本质上是在做。

Base o = new Dervied();

Derived是一个基础,但它不能从 更改DerivedBase所以Derived仍然存在的实现。

于 2013-04-02T09:10:42.447 回答
0

您在这里使用的称为inheritance. 在您的情况下,您的Program类继承自 testclass1. 继承描述了一种 is-a 关系:你是一个人,Programis-a testclass1

正因为如此,你可以说testclass1 t = new Program()。您创建一个类型的变量testclass1并使用 a 对其进行初始化Program,它是 的一种特殊类型testclass1

您可以使用继承的一件事是扩展或替换行为。类中的virtual关键字testclass1意味着从它派生的类可以替换方法,就像您override在类中使用关键字一样Program

以下几行将给出不同的结果:

Program p = new Program();
testclass1 t = new testclass1();
t.test();
p.test();

这将打印:

Child class
Parent class

但是,您可以像使用`testclass1 一样使用您的Program类,就像您可以像对待动物一样对待人或狗一样。

于 2013-04-02T09:14:37.483 回答