Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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重写#_C# - Fatal编程技术网

C# 使用虚拟关键字&;使用C重写#

C# 使用虚拟关键字&;使用C重写#,c#,C#,关于“C#3.0——完整参考”的书(第295页)说: 该程序创建一个名为base的基类和两个名为Derived1的派生类 并被嘲笑2。Base声明一个名为Who()的方法,派生类将覆盖它。 在Main()方法中,声明了Base、Derived1和Derived2类型的对象。也, 声明了一个类型为Base的引用,称为baseRef。然后程序分配一个引用 向baseRef调用每种类型的对象,并使用该引用调用Who()。作为输出 如图所示,执行的Who()的版本由所引用对象的类型决定 在调用时,不是按

关于“C#3.0——完整参考”的书(第295页)说:

该程序创建一个名为base的基类和两个名为Derived1的派生类 并被嘲笑2。Base声明一个名为Who()的方法,派生类将覆盖它。 在Main()方法中,声明了Base、Derived1和Derived2类型的对象。也, 声明了一个类型为Base的引用,称为baseRef。然后程序分配一个引用 向baseRef调用每种类型的对象,并使用该引用调用Who()。作为输出 如图所示,执行的Who()的版本由所引用对象的类型决定 在调用时,不是按baseRef的类类型

现在的问题是,我们是否有必要使用basereference并为其分配每个派生类的对象,以便利用方法重写和虚拟关键字,因为我已经测试过它是否工作正常,而不是在我没有使用任何basereference时

给你:

class Base
{
    // Create virtual method in the base class.  
    public virtual void Who()
    {
        Console.WriteLine("Who() in Base");
    }
}
class Derived1 : Base
{
    // Override Who() in a derived class. 
    public override void Who()
    {
        Console.WriteLine("Who() in Derived1");
    }
}

class Derived2 : Base
{
    // Override Who() again in another derived class. 
    public override void Who()
    {
        Console.WriteLine("Who() in Derived2");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Base baseOb = new Base();
        Derived1 dOb1 = new Derived1();
        Derived2 dOb2 = new Derived2();

        Base baseRef; // a base-class reference 

        baseRef = baseOb;
        baseRef.Who();

        baseRef = dOb1;
        baseRef.Who();

        baseRef = dOb2;
        baseRef.Who();

        //but this works too the same

          baseOb.Who();
          dob1.Who();
          dob2.Who();



    }
}
}


勇敢地回答这个问题,而不是投反对票

他们在这里试图说明的一点是,如果您执行
Base baseRef=new-Derived1()
,那么重写虚拟方法时使用的行为就是派生类的行为。如果您不知道它应该如何工作,您可能会认为,如果您的引用类型为
Base
,它将在该类上使用该方法。这当然是错误的,你也知道,但向人们展示这一点是很好的

如果使用
new
关键字而不是
override
,则确实存在这种行为。尝试将您的类更改为此,然后再次运行:

class Derived2 : Base
{
    // Override Who() again in another derived class. 
    public new void Who()
    {
        Console.WriteLine("Who() in Derived2");
    }
}
现在您将看到最后一个块的工作方式与之前完全相同,但是当
BaseRef
dOb2
时,它实际上调用基类上的方法。这是因为override替换了虚拟方法调用,而new表示派生类中有不同的方法,而在基类上调用方法的方式是这样的。详细谈了这个


需要注意的是,您很少想使用
new
修饰符,因此不要在这个问题上纠缠太久。

我喜欢输出显示的位。您最好使用代码示例来问这个问题。但是我认为basereference被用来表明,即使编译器刚刚被告知它是
Base
类型,它仍然在调用
Derived1
中的方法,而不是
Base
方法。因此,现在就去做你喜欢的事情吧:-P@MrCoderYou现在可以有一个更好的画面了@ChrisI无法通过profile接近你(一旦你提出)但请看这里:@MrCoder@JavedIqbal:公平地说,最初的问题不是一个很好的问题,不幸的是,被否决的人不太可能回来看到你所做的改变。有时人们有时间建设性地批评一个问题,但没有人有时间在任何地方这样做,所以有时人们会这样做向下投票并继续。但如果他们不愿意编辑/建议,为什么他们会向下投票……他们可能会“通过”并让其他人如您和@MrCoder发表评论:(他们只是不鼓励OP:(有些人对反馈反应不好(因为他们不断问垃圾问题,不做建议的改进).遗憾的是,你被比我更疲惫的人归为这一类。:)