- 此问题在此处已有答案**:
Overriding methods in C#(2个答案)
昨天关门了。
我有这样的情况。它是正确的吗?如果不正确怎么做?
namespace Chess
{
public abstract class Figure
{
public bool SomeMethod()
{
return true;
}
}
public class Pawn : Figure
{
public new bool SomeMethod()
{
return false;
}
}
public class Board
{
public void SomeBoardMethod()
{
Figure figure = new Pawn();
var result1 = figure.SomeMethod();
var result2 = figure.GetType().GetMethod(nameof(Figure.SomeMethod)).Invoke(this, new object[] { });
}
}
}
结果1为真结果2为假figure.GetType().GetMethod(nameof(Figure.SomeMethod)).Invoke(this, new object[] { });
是否正确?
2条答案
按热度按时间b4lqfgs41#
我认为类型检查和强制转换比使用反射更好:
较新的C#版本允许您使用模式匹配:
但是,如果您希望始终从子类调用该方法,为什么不在基类中将该方法标记为
virtual
(或abstract
),然后在子类中标记为override
呢?或者,您可能正在寻找双分派,并希望实现类似Visitor pattern的东西。
hkmswyz62#
在基类中有一个实现,如果要重写,则声明方法
virtual
。在这种情况下,不需要abstract
关键字,因为所有内容都是为基类定义的。这里的基本功能由继承类通过一个名为
BaseMethod()
的附加方法公开,然后您可以使用模式匹配来获得Pawn
特定的方法。我觉得你需要读一些关于继承如何工作的书。
下面是一些测试代码,基类包含3个方法。一个普通方法
CommonMethod()
,一个虚方法SpecialMethod()
和一个普通方法,意图隐藏在一个名为FigureMethod()
的派生类中。基类
Figure
有两个派生类Pawn
和Queen
,它们要么是override
,要么是用new
关键字重新定义方法。我从5个示例调用了所有三个方法。3个示例是基类
Figure
变量,2个示例是结果如下:
CommonMethod()
的所有方法都产生相同的结果。SpecialMethod()
调用使用基本实现或Pawn
类型的特定实现。Queen
类型并且它重新定义了此方法对此特定类型的作用时,才能调用FigureMethod()
。一般来说,除非绝对必要,否则不要使用
new
关键字。这是因为重新定义的方法可能具有与常规方法完全不同的功能,并且可能导致错误和/或维护问题。