C#重写方法并返回不同的对象

4

我有一个位于基类的虚方法。每次我重写它时,我希望返回不同对象类型。我知道这是不可能的,但应该如何处理这种情况最好呢?

以下是基类方法的示例:

public virtual void clickContinue() 
{
    //click the continue button
}

并且重写它的方法:

public override myObject clickContinue()
{
    //click then continue button
    //return myObject
}

我需要进行几个类似的覆盖,每一个都返回不同的对象。我知道以上方法不能实现这个目标,我正在尝试找出最佳解决方案来处理这种情况。


你可以有一个返回 object 的基础方法,但如果你的对象实现了一个公共接口并且能够返回 IMyObjectType,那么效果会更好。或者使用一个通用的基类,这样每个子类都可以指定 T。在问题中展示更多关于你的对象类型的细节将有助于你获得更好的答案。 - Ian Mercer
2个回答

7

我知道这是不可能的,但处理这种情况最好的方法是什么?

如果您不需要默认实现,可以将类定义为泛型,并返回泛型类型:

abstract class YourBase<T>
{
     abstract T ClickContinue();
}

class YourOverride : YourBase<MyObject>
{
     override MyObject ClickContinue()
     {
        //...

如果您拥有基本方法,这是一个很好的解决方案。当然,如果基本方法由另一个库定义,那么这种方法就行不通了,因为您无法修改签名。 - neontapir

0

我感觉到了对覆盖机制的滥用。它的理念是你用不同的参数做同样的事情。方法的名称应该告诉你它做什么。那么,同一个过程怎么可能有时返回 void(不返回任何东西),有时又返回一些东西(非 void)呢?

你确定你不应该有两个完全不同的方法吗?这也可能会使 API 更清晰。

否则,考虑始终返回 object,这在覆盖的情况下总是为 null

显然,通用方式更好,因为它更安全。返回 object 意味着你放弃了类型,并手动进行转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接