C# 使用override和new关键字覆盖ToString()
我是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
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没错。谢谢,我得到了答案。