这两者有什么区别?

时间:2013-04-02 09:08:01

标签: c#

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()答案是一样的!

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

2 个答案:

答案 0 :(得分:2)

您正在为t Program的实例分配TestClass,因此它总是会调用Program的方法实现,因为它是派生类并且是重写的基本方法。

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是一个基础,但它不能从Derived更改为Base,因此Derived的实现仍然有效。

答案 1 :(得分:0)

您在此处使用的内容称为inheritance。在您的情况下,您的Program类继承自testclass1。继承描述了一种is-a关系:您是一个人,Program是一个testclass1

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

您可以使用继承的一个方面是扩展或替换行为。 testclass1类中的override关键字意味着从中派生的类可以替换您使用Program类中Program p = new Program(); testclass1 t = new testclass1(); t.test(); p.test(); 关键字的方法。

以下几行会产生不同的结果:

Child class
Parent class

这将打印:

Program

然而,你可以使用你的{{1}}类,就好像它是一个`testclass1一样,就像你可以被视为一个人或狗一样,就像它是动物一样。