C# 覆盖与常规方法
有人能解释一下重写和普通方法之间的区别吗?什么时候应该对后者使用重写 我发现的每一篇教程都使用“多态性”和“派生类”等词,而不仅仅是解释它们的应用程序和应该使用它们的时间 我特别使用C#,但是理解覆盖作为一个概念将非常有帮助C# 覆盖与常规方法,c#,.net,vb.net,overriding,C#,.net,Vb.net,Overriding,有人能解释一下重写和普通方法之间的区别吗?什么时候应该对后者使用重写 我发现的每一篇教程都使用“多态性”和“派生类”等词,而不仅仅是解释它们的应用程序和应该使用它们的时间 我特别使用C#,但是理解覆盖作为一个概念将非常有帮助 感谢您对该主题的任何输入。当您创建与另一个函数同名但功能不同的方法/函数/子例程时,会发生重写。一个突出的例子是Equals方法。自定义对象可以重写此方法以返回相等的概念。例如,如果您有一个Person对象,并且当两个人具有相同的名称时,您可以覆盖现有的Equals方法以返
感谢您对该主题的任何输入。当您创建与另一个函数同名但功能不同的方法/函数/子例程时,会发生重写。一个突出的例子是Equals方法。自定义对象可以重写此方法以返回相等的概念。例如,如果您有一个Person对象,并且当两个人具有相同的名称时,您可以覆盖现有的Equals方法以返回两个人是否具有相同的名称。祝你好运 当您创建一个与另一个函数同名但功能不同的方法/函数/子例程时,会发生重写。一个突出的例子是Equals方法。自定义对象可以重写此方法以返回相等的概念。例如,如果您有一个Person对象,并且当两个人具有相同的名称时,您可以覆盖现有的Equals方法以返回两个人是否具有相同的名称。祝你好运 简单地说,重写是用于更改派生类中方法的行为的。例如,假设您有一个
Animal.Speak()
方法:
class Animal
{
public virtual void Speak()
{
Console.WriteLine("The animal makes random animal noises.");
}
}
class Cat : Animal
{
}
现在,如果你有一种特定类型的动物,你会想要覆盖Speak()
方法来制造这种动物会发出的噪音:
class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("The dog barks.");
}
}
现在,如果你做一个狗的物体,让它说话,它会吠叫。现在让我们考虑一下,如果你有一个CAT类但没有重写<代码> Script()/代码>方法:
class Animal
{
public virtual void Speak()
{
Console.WriteLine("The animal makes random animal noises.");
}
}
class Cat : Animal
{
}
如果您有此代码:
Animal dog = new Dog();
Animal cat = new Cat();
dog.Speak();
cat.Speak();
你会看到:
The dog barks.
The animal makes random animal noises.
简单地说,重写是用于更改派生类中方法的行为的。例如,假设您有一个
Animal.Speak()
方法:
class Animal
{
public virtual void Speak()
{
Console.WriteLine("The animal makes random animal noises.");
}
}
class Cat : Animal
{
}
现在,如果你有一种特定类型的动物,你会想要覆盖Speak()
方法来制造这种动物会发出的噪音:
class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("The dog barks.");
}
}
现在,如果你做一个狗的物体,让它说话,它会吠叫。现在让我们考虑一下,如果你有一个CAT类但没有重写<代码> Script()/代码>方法:
class Animal
{
public virtual void Speak()
{
Console.WriteLine("The animal makes random animal noises.");
}
}
class Cat : Animal
{
}
如果您有此代码:
Animal dog = new Dog();
Animal cat = new Cat();
dog.Speak();
cat.Speak();
你会看到:
The dog barks.
The animal makes random animal noises.
“重写”方法是什么意思?
有两种选择:
public class A
{
public void Method1() {}
public virtual void Method2() {}
public virtual void Method3() {}
}
如果您创建类B,它是从A派生的,则在这种情况下,您将有机会重写虚拟方法:
public class B : A
{
public override void Method2() {}
public override void Method3() {}
}
通过这种方式,您可以从类A更改基本功能,从类B更改新功能。
所以,当您从类B的实例调用方法时,您将从类B中被重写的方法获得功能:
B instanceB = new B();
instanceB.Method2();
public class A
{
public void Method1() {}
public virtual void Method2() {}
public virtual void Method3() {}
}
如果您创建类B,它是从A派生的,则在这种情况下,您将有机会重写虚拟方法:
public class B : A
{
public override void Method2() {}
public override void Method3() {}
}
通过这种方式,您可以从类A更改基本功能,从类B更改新功能。
所以,当您从类B的实例调用方法时,您将从类B中被重写的方法获得功能:
B instanceB = new B();
instanceB.Method2();
例如,如果有一个预定义的类有一个方法“ABC”,并且您希望更改其行为。在这种情况下,您必须在要将其默认值更改为您真正想要的值的方法ABC之前编写关键字override。当您必须更改已有的方法时,简单的单词会使用覆盖。当您为任何已经不存在的对象创建新方法时,不要使用重写。例如,如果有一个预定义的类具有方法“ABC”,并且您希望更改其行为。在这种情况下,您必须在要将其默认值更改为您真正想要的值的方法ABC之前编写关键字override。当您必须更改已有的方法时,简单的单词会使用覆盖。当您为任何已经不存在的对象创建新方法时,不要使用override。第一句解释了它。如果这是一个OOP编程问题,并且由于这不是一个教程站点,我不确定“使用外行术语”有多合适或有用。@puropoix,那么我认为我的第二个问题更适用。什么时候应该使用覆盖而不仅仅是方法?谢谢。它与继承一起使用。如果
Dog
继承自Animal
,Speak
方法无法在基类上实现,因为您不知道是吠叫、喵喵叫、唧唧叫还是咆哮。因此(一种方法)是覆盖派生类(Bird、Cat、Dog、Grumpkin、Snark)上的Speak
,以实现特定行为