这两者有什么区别

本文关键字:什么 区别 | 更新日期: 2023-09-27 18:06:53

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

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

这两者有什么区别

您正在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的实现仍然存在。

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

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

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

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

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

这将打印:

Child class
Parent class

但是,您可以将Program类用作"testclass1",就像您可以像对待动物一样对待人或狗一样。