覆盖VS Normal方法

时间:2017-10-27 17:18:13

标签: c# .net vb.net override method-overriding

有人可以解释覆盖和普通方法之间的区别,以及何时应该对后者使用覆盖?

我发现的每个教程都使用“Polymorphism”和“Derived Classes”之类的单词,而不仅仅是解释它们的应用以及应该何时使用它们。

我特别使用C#,但理解覆盖作为一个概念会非常有用。

感谢您对此主题的任何意见。

4 个答案:

答案 0 :(得分:4)

简单地说,覆盖是为了在想要更改派生类中方法的行为时。例如,假设您使用Animal.Speak()方法:

class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("The animal makes random animal noises.");
    }
}

现在,如果你有一种特定类型的动物,你想要覆盖那个Speak()方法来发出那种动物会产生的噪音:

class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("The dog barks.");
    }
}

现在,如果你制作一个Dog对象并告诉它说话,它就会吠叫。现在让我们考虑你是否有Cat类,但没有覆盖Speak()方法:

class Cat : Animal
{
}

如果您有此代码:

Animal dog = new Dog();
Animal cat = new Cat();

dog.Speak();
cat.Speak();

你会看到这个:

The dog barks.
The animal makes random animal noises.

答案 1 :(得分:0)

当您创建与另一个函数同名但具有不同功能的方法/函数/子例程时,会发生覆盖。一个突出的例子是Equals方法。可以为自定义对象重写此方法以返回您的相等概念。例如,如果您有一个Person对象并且当它们具有相同的名称时确定2个人相等,则可以覆盖现有的Equals方法以返回2个人是否具有相同的名称。祝你好运!

答案 2 :(得分:0)

例如,如果有一个预定义的类,它有一个方法" ABC"你想改变它的行为。在这种情况下,您必须在方法ABC之前编写关键字覆盖,并将其从默认值更改为您真正想要的方法。当您必须更改现有方法时,简单的单词使用覆盖。在为任何已经不存在的对象创建新方法时,请不要使用覆盖。

答案 3 :(得分:-1)

你是什么意思"覆盖"方法? 有两种选择:

  1. 覆盖子类中的虚方法。这里"方法覆盖"是多态的一部分 - 面向对象编程的概念之一。
  2. 例如,这里有一个带有一些虚方法的基类A:

    public class A
    {
        public void Method1() {}
        public virtual void Method2() {}
        public virtual void Method3() {}
    }
    

    如果你创建了从A派生的B类,你将有机会在这种情况下覆盖虚拟方法:

    public class B : A 
    {
        public override void Method2() {}
        public override void Method3() {}
    } 
    

    通过这种方式,您可以通过B类的新功能从A类更改基本功能。 因此,当您从类B的实例调用方法时,您将从类B中的overriden方法获得功能:

    B instanceB = new B();
    instanceB.Method2();
    
    1. 覆盖方法签名。在这里,您可以使用多个具有相同名称但具有不同签名的方法。
    2. 例如,你有这样的类有3个方法,它们有一个名称TestMethod,但有不同的签名(不同的输入和输出参数类型):

      public class TestClass
      {
          public void TestMethod() {}
          public int TestMethod(int value) {}
          public string TestMethod(int value) {}
      }