使用override和new关键字来重写ToString()方法

4
我是C#的新手。对于这个问题感到困惑。
我已经使用override和new关键字重写了ToString()方法,两者都给了我相同的输出。那么它们之间有什么区别呢?
以下是我的示例:
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关键字之间的区别。我想知道在覆盖对象方法的概念中两种方法之间的区别。


2
我正在尝试理解C#的基础知识,这不是书籍、导师和教程的作用吗? - Ňɏssa Pøngjǣrdenlarp
我已经了解到每个类都是继承自Object类的。所以我们可以在两者中都使用new和override,就像上面所有的方法一样吗?并且它会给我相同的输出结果吗? - Pravin Tukadiya
@JohnEphraimTugado 这意味着我们可以使用 new 和 Override 来覆盖 Object 类的所有方法,对吗? - Pravin Tukadiya
你需要了解继承、重写和重载的概念。如果你仔细阅读,你就能得到问题的答案。https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/knowing-when-to-use-override-and-new-keywords - Chetan
两者都给我相同的功能。 - Pravin Tukadiya
显示剩余3条评论
3个回答

2

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

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时才会调用你的ToString实现。

了解更多信息,请单击此处


如果我们将实例分配给基类(Object),那么只有这样才会有所区别,否则它是相同的。对吗? - Pravin Tukadiya
@PravinTukadiya 没错。 - Sweeper
谢谢,我得到了答案。 - Pravin Tukadiya

0
在类 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();
    }
}

在这里,您将在B类中隐藏方法,因为您已经继承了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();
    }
}

在这里,我们已经重写了类A中的方法,在类B中。这意味着类B的方法就像扩展或者说它与类A有不同的含义。你将会得到以下输出:

ClassA::Method
ClassB::Method

0

你可以很容易地通过谷歌搜索找到这个。

来自 MSDN

在C#中,派生类中的方法可以与基类中的方法同名。您可以使用 new 和 override 关键字指定方法之间的交互方式。override 修饰符扩展了基类方法,而 new 修饰符隐藏了它。本主题中的示例说明了其中的区别。

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


这句话的意思是在这种情况下两者是相同的吗? - Pravin Tukadiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接