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