C# 重写/新方法
我不熟悉C#(来自C++) <> > P> >我可以声明一个方法是“代码>虚拟< /COD>”和“代码>覆盖< <代码>?(C++中,该方法也可以是虚拟的,在基础和派生类中)C# 重写/新方法,c#,inheritance,polymorphism,virtual-functions,C#,Inheritance,Polymorphism,Virtual Functions,我不熟悉C#(来自C++) > P> >我可以声明一个方法是“代码>虚拟< /COD>”和“代码>覆盖< ?(C++中,该方法也可以是虚拟的,在基础和派生类中) 我的教科书中关于newmethod关键字的解释是: 有时,您可能希望创建一个存在于基类中的方法的自己的实现。Line类通过声明其 自己的print()方法。Line print()方法隐藏DrawingObject print()方法。其效果是父print()方法将不会 调用,除非我们做了一些特殊的事情来确保它被调用。 请注意Line
new
method关键字的解释是:using System;
public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
public new void print()
{
base.print();
Console.WriteLine("I'm a Child Class.");
}
}
public class Circle : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Circle.");
}
}
public class Square : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Square.");
}
}
是的,您可以使用
virtual
关键字标记方法,然后在派生类中使用override
重写它
new
来明确您的意图,并确保这不是一个错误是的,您可以使用
virtual
关键字标记方法,然后在派生类中使用override
重写它
new
来明确您的意图,并确保这不是一个错误是的,您可以使用
virtual
关键字标记方法,然后在派生类中使用override
重写它
new
来明确您的意图,并确保这不是一个错误是的,您可以使用
virtual
关键字标记方法,然后在派生类中使用override
重写它
new
来明确您的意图,并确保这不是一个错误派生类中的
new
关键字称为“隐藏”基类的方法,本质上它隐藏了该方法的基类实现。如果省略new
关键字,您将看到的警告消息是编译器告诉您应该明确声明您打算使用new
语法隐藏/隐藏该方法。在语法中使用new
关键字可以让任何阅读代码的人清楚地看到,您隐藏了一个基本实现
注意:这只是一个警告,因为通过在派生类中实现非虚方法,您正在隐藏/隐藏基类的实现。编译器只是告诉您要做一个好公民,并通知正在阅读您代码的其他人
派生类中的
new
关键字称为“隐藏”基类的方法,本质上它隐藏了该方法的基类实现。如果省略new
关键字,您将看到的警告消息是编译器告诉您应该明确声明您打算使用new
语法隐藏/隐藏该方法。在语法中使用new
关键字可以让任何阅读代码的人清楚地看到,您隐藏了一个基本实现
注意:这只是一个警告,因为通过在派生类中实现非虚方法,您正在隐藏/隐藏基类的实现。编译器只是告诉您要做一个好公民,并通知正在阅读您代码的其他人
派生类中的
new
关键字被调用“
public class Base
{
public void Method()
{
Console.WriteLine("Base.Method()");
}
}
public class Derived : Base
{
public new void Method()
{
Console.WriteLine("Derived.Method()");
}
}
Derived obj = new Derived();
obj.Method(); // Will output "Derived.Method()"
((Base)obj).Method() // Will output "Base.Method()"