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

时间:2018-04-25 05:45:35

标签: c# oop override

我是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方法的概念中。

3 个答案:

答案 0 :(得分: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中所做的操作称为隐藏。当变量的编译时类型不再是该类型时,隐藏会失去效果。只有在编译时类型为ToString时才会调用A的实现。

了解详情here

答案 1 :(得分:0)

你可以轻松谷歌。

来自MSDN

  

在C#中,派生类中的方法可以与方法具有相同的名称   在基类中。您可以使用指定方法的交互方式   new和override关键字。覆盖修改器扩展了基础   class方法,并且new修饰符隐藏它。不同的是   在本主题的示例中说明。

     

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

答案 2 :(得分: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();
    }
}

您在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 A's中覆盖了Class B方法。这意味着ClassB method就像扩展,或者你可以说它与ClassA具有不同的含义。您将获得如下所示的输出

ClassA::Method
ClassB::Method