Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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# 使用override和new关键字覆盖ToString()_C#_Oop_Overriding - Fatal编程技术网

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

C# 使用override和new关键字覆盖ToString(),c#,oop,overriding,C#,Oop,Overriding,我是c#的新手。对这个问题感到困惑 我使用override和new关键字重写了ToString()。两者都给我相同的输出。那么两者之间的区别是什么 这是我的例子 class A { public new string ToString() { return "With New Keyword"; } } class B { public override string ToString() { return "With Ov

我是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关键字之间的区别。我想知道这两种方法之间的区别。在override对象方法的概念中。

你可以很容易地用谷歌搜索这个

来自

在C#中,派生类中的方法可以与方法同名 在基类中。您可以通过使用指定方法的交互方式 新建和覆盖关键字。“覆盖”修改器扩展了基础 类方法,新的修改器将其隐藏。区别在于 如本主题中的示例所示

在控制台应用程序中,声明以下两个类:BaseClass 和被嘲笑的阶级。DerivedClass继承自基类


当您这样做时,会产生不同:

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
的实现


了解更多信息。

在类
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();
    }
}
在这里,我们已经覆盖了
类B
中的
类A的
方法。这意味着
ClassB方法
类似于扩展,或者您可以说它与
ClassA
具有不同的含义。您将得到如下输出

ClassA::Method
ClassB::Method

我正在努力理解C#
的基本知识,这不是书、导师和教程的目的吗?@puropoix我编辑了我的问题。我的英语不好,所以我这样写。如果你曾经阅读过文档的内容,但仍然感到困惑,我建议您理解不同的OOP术语,例如
extend
。我已经读到每个类都是扩展对象类的。所以我们可以在这两种方法中使用new和override,就像上面提到的所有方法一样?它给了我一个相同的输出?@johnepraimtuga这是否意味着我们可以使用new和override覆盖对象类的所有方法?rightit意味着在这种情况下两者都是相同的?这意味着如果我们将实例分配给基于实例的类(对象),而不仅仅是它,它将在其他方面产生不同,它是相同的。对吗?@PravinTukadiya没错。谢谢,我得到了答案。