有人可以解释覆盖和普通方法之间的区别,以及何时应该对后者使用覆盖?
我发现的每个教程都使用“Polymorphism”和“Derived Classes”之类的单词,而不仅仅是解释它们的应用以及应该何时使用它们。
我特别使用C#,但理解覆盖作为一个概念会非常有用。
感谢您对此主题的任何意见。
答案 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)
你是什么意思"覆盖"方法? 有两种选择:
例如,这里有一个带有一些虚方法的基类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();
例如,你有这样的类有3个方法,它们有一个名称TestMethod,但有不同的签名(不同的输入和输出参数类型):
public class TestClass
{
public void TestMethod() {}
public int TestMethod(int value) {}
public string TestMethod(int value) {}
}