Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 覆盖与常规方法_C#_.net_Vb.net_Overriding - Fatal编程技术网

C# 覆盖与常规方法

C# 覆盖与常规方法,c#,.net,vb.net,overriding,C#,.net,Vb.net,Overriding,有人能解释一下重写和普通方法之间的区别吗?什么时候应该对后者使用重写 我发现的每一篇教程都使用“多态性”和“派生类”等词,而不仅仅是解释它们的应用程序和应该使用它们的时间 我特别使用C#,但是理解覆盖作为一个概念将非常有帮助 感谢您对该主题的任何输入。当您创建与另一个函数同名但功能不同的方法/函数/子例程时,会发生重写。一个突出的例子是Equals方法。自定义对象可以重写此方法以返回相等的概念。例如,如果您有一个Person对象,并且当两个人具有相同的名称时,您可以覆盖现有的Equals方法以返

有人能解释一下重写和普通方法之间的区别吗?什么时候应该对后者使用重写

我发现的每一篇教程都使用“多态性”和“派生类”等词,而不仅仅是解释它们的应用程序和应该使用它们的时间

我特别使用C#,但是理解覆盖作为一个概念将非常有帮助


感谢您对该主题的任何输入。

当您创建与另一个函数同名但功能不同的方法/函数/子例程时,会发生重写。一个突出的例子是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.
“重写”方法是什么意思? 有两种选择:

  • 重写子类中的虚拟方法。这里“方法重写”是多态性的一部分,多态性是面向对象编程的概念之一 例如,这里有一个基类a和一些虚拟方法:

    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();
    
  • 重写方法签名。在这里,您可以有多个名称相同但签名不同的方法
  • 例如,这样的类有3个方法,它们有一个名称TestMethod,但有不同的签名(不同的输入和输出参数类型):

    “重写”方法是什么意思? 有两种选择:

  • 重写子类中的虚拟方法。这里“方法重写”是多态性的一部分,多态性是面向对象编程的概念之一 例如,这里有一个基类a和一些虚拟方法:

    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();
    
  • 重写方法签名。在这里,您可以有多个名称相同但签名不同的方法
  • 例如,这样的类有3个方法,它们有一个名称TestMethod,但有不同的签名(不同的输入和输出参数类型):


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

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

    第一句解释了它。如果这是一个OOP编程问题,并且由于这不是一个教程站点,我不确定“使用外行术语”有多合适或有用。@puropoix,那么我认为我的第二个问题更适用。什么时候应该使用覆盖而不仅仅是方法?谢谢。它与继承一起使用。如果
    Dog
    继承自
    Animal
    Speak
    方法无法在基类上实现,因为您不知道是吠叫、喵喵叫、唧唧叫还是咆哮。因此(一种方法)是覆盖派生类(Bird、Cat、Dog、Grumpkin、Snark)上的
    Speak
    ,以实现特定行为