C# 重写至少一个方法

C# 重写至少一个方法,c#,virtual,abstract,overriding,C#,Virtual,Abstract,Overriding,让我们假设存在以下类: public class foo{ internal virtual object M1(/*args*/){return null;} internal virtual object[] M2(/*args*/){return null;} public SomeStruct SomeMethod(){ return new SomeStruct { Obj = M1();

让我们假设存在以下类:

public class foo{
    internal virtual object M1(/*args*/){return null;}
    internal virtual object[] M2(/*args*/){return null;}

    public SomeStruct SomeMethod(){
        return new SomeStruct
        {
            Obj = M1();
            ObjArr = M2();
        }
    }
}
使用以下结构:

public class SomeStruct
{
    public object Obj;
    public object[] ObjArr;
}
有没有办法确保(最好是在编译时)强制重写至少一个方法或恰好一个类foo的方法


在别人说之前-我知道可以使用一个方法检查结果是否为array(或IEnumerable),然后将其分配到正确的字段,但这比只运行空方法需要更多的时间。我只是想知道是否可以这样做。

您可以标记方法
abstract
,然后您将被迫实现这两种方法。这似乎是最简单的解决方案:

internal abstract object M1(/*args*/){return null;}
internal abstract object[] M2(/*args*/){return null;}
另一个选项实际上太复杂了,就是编写一个Roslyn代码分析器,它将检查代码并确定代码是否有效


作为旁注:字段也应该驻留在基类中。如果要使泛型的类型成为泛型,可以使用泛型。

可以标记方法
abstract
,然后强制实现这两种方法。这似乎是最简单的解决方案:

internal abstract object M1(/*args*/){return null;}
internal abstract object[] M2(/*args*/){return null;}
另一个选项实际上太复杂了,就是编写一个Roslyn代码分析器,它将检查代码并确定代码是否有效


作为旁注:字段也应该驻留在基类中。如果您想使泛型的类型成为泛型,可以使用泛型。

基本上是“否”。至少,如果不编写自己的自定义代码分析器(可能通过Roslyn),并考虑如果
X:foo
覆盖
M1
,并且
Y:X
覆盖
M2
,“不”,基本上会发生什么。至少,如果不编写您自己的自定义代码分析器(可能通过Roslyn),并考虑如果
X:foo
覆盖
M1
,并且
Y:X
覆盖
M2

您需要在子类中创建一个新方法,该方法使用新的返回类型隐藏基类的实现。不能像现在这样使用虚拟方法重载方法。方法重载是通过更改参数而不是返回类型来完成的

因此,要么在子类中隐藏父方法,要么用另一个名称创建一个方法

这是我能想到的,只是一个例子

在这里运行


您需要在子类中创建一个新方法,该方法使用新的返回类型隐藏基类的实现。不能像现在这样使用虚拟方法重载方法。方法重载是通过更改参数而不是返回类型来完成的

因此,要么在子类中隐藏父方法,要么用另一个名称创建一个方法

这是我能想到的,只是一个例子

在这里运行


是的,但这将迫使这两种方法在儿童身上得到实施。而我们需要的是一个。至于泛型-是的,这是在我们的项目中完成的,但为了使事情更简单,我没有在这里包括它。是的,这将是结果。如果愿意,您可以从第二个方法返回
null
或默认实现。是的,但这将强制在child中实现这两个方法。而我们需要的是一个。至于泛型-是的,这是在我们的项目中完成的,但为了使事情更简单,我没有在这里包括它。是的,这将是结果。如果愿意,可以从第二个方法返回
null
或默认实现。这并不能回答问题。当然-可以重写返回类型,但在提供的情况下,它所做的只是强制检查返回类型是object还是object[]。这可能需要一些时间,具体取决于对象大小。既然base是返回对象,并且在base中使用了它,那么重写返回类型首先有什么意义呢?Object[]仍然是一个对象。我是根据我从您的问题中理解的内容回答的,这只是一个基于您显示的数据类型的示例。这并不能回答您的问题。当然-可以重写返回类型,但在提供的情况下,它所做的只是强制检查返回类型是object还是object[]。这可能需要一些时间,具体取决于对象大小。既然base是返回对象,并且在base中使用了它,那么重写返回类型首先有什么意义呢?Object[]仍然是一个对象。我的回答基于我从您的问题中理解的内容,这只是一个基于您显示的数据类型的示例。