繁体   English   中英

使用override和new关键字覆盖ToString()

[英]override ToString() with override and new keyword

我是c#.confuse中的新手。

我用覆盖覆盖了ToString(),新的keyword.both给了我相同的输出。然后两者之间有什么区别。

这是我的例子

class A
{
    public new string ToString()
    {
        return "With New Keyword";
    }
}
class B
{
    public override string ToString()
    {
        return "With Override Keyword";
    }
}


class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        B b = new B();

        Console.WriteLine(a.ToString());
        Console.WriteLine(b.ToString());

        Console.Read();
    }

}

产量

使用新关键字

使用覆盖关键字

我知道这是一个愚蠢的问题。 请任何人帮我两个方法给我区别。

我不是在询问new和override关键字之间的区别。我想知道两种方法之间的区别。在Override Object方法的概念中。

当你这样做时,它会有所不同:

object a = new A(); // notice the type of the variable here!
object b = new B();
Console.WriteLine(a.ToString());
Console.WriteLine(b.ToString());

a.ToString()不会调用ToString的实现,而是调用object.ToString ,它返回对象的完全限定类型名称。 b.ToString() 调用您的实现。

你在B所做的被称为覆盖。 你在A所做A就是隐藏 当变量的编译时类型不再是该类型时,隐藏会失去效果。 只有在编译时类型为A时才会调用ToString实现。

在这里了解更多。

你可以轻松谷歌这个。

来自MSDN

在C#中,派生类中的方法可以与基类中的方法具有相同的名称。 您可以使用new和override关键字指定方法的交互方式。 override修饰符扩展基类方法,new修饰符隐藏它。 本主题中的示例说明了这种差异。

在控制台应用程序中,声明以下两个类,BaseClass和DerivedClass。 DerivedClass继承自BaseClass。

B类中,您将覆盖ToString()方法,即Object.ToString()因为您没有继承A 现在考虑下面的例子,

class A
{
    public string ReturnString()
    {
       return "ClassA::Method";
    }
}
class B : A
{
    public newstring ReturnString()
    {
        return "ClassB::Method";
    }
}


class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        B b = new B();

        Console.WriteLine(a.ToString());
        Console.WriteLine(b.ToString());

        Console.Read();
    }
}

在这里,您将继承Class A class B的方法隐藏在class B Class A 因此,您将获得两个方法调用的ClassA::Method输出。

现在考虑下面的例子

class A
{
    public virtual string ReturnString()
    {
       return "ClassA::Method";
    }
}
class B : A
{
    public override string ReturnString()
    {
        return "ClassB::Method";
    }
}


class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        B b = new B();

        Console.WriteLine(a.ToString());
        Console.WriteLine(b.ToString());

        Console.Read();
    }
}

在这里,我们重写了Class B Class A's Class B方法。 这意味着ClassB method就像扩展一样,或者你可以说它与ClassA有不同的含义。 您将获得如下输出

ClassA::Method
ClassB::Method

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM