扩展类层次结构

本文关键字:层次结构 扩展 | 更新日期: 2023-09-27 18:04:56

我有一个抽象基类:

public abstract class BaseClass
{
    public double CommonMethodForAllSubClasses(double parameter)
    {
        //common implementation
        return 0;
    }
    public abstract double MethodThatMustBeDefinedInSubClasses(double parameter);
}

和它下面的类层次。

我想在另一个程序集中为基类及其子类创建一个扩展类。我想用一个静态类和一个方法来做它,它接收作为参数:

public static Method(this BaseClass, ...)

但是我希望这个静态方法被定义为所有子类从BaseClass。我知道我不能做一个静态的抽象方法,但我想避免在类本身实现这些方法…如果编译器"告诉我"必须为子类重新定义这些方法,那就太好了。

扩展类层次结构

但是我希望这个静态方法是为BaseClass的所有子类定义的。

您的扩展方法可以从派生类的实例调用。但我想那不是你的意思。

如果编译器"告诉我"这些方法必须为子类重新定义,那就太好了。

在基类上实现它作为常规的abstract方法是实现这一目标的唯一方法。

这是你想要的吗?

public abstract class BaseClass
{
    protected abstract void MethodThatMustBeDefinedInSubClasses();
}
public class ChildClass : BaseClass
{
    protected override void MethodThatMustBeDefinedInSubClasses()
    {
        Console.WriteLine("Do");
    }
}
public static class BaseClassExtensions
{
    public static void DoExtension(this BaseClass foo) { }
    public static void DoExtension(this ChildClass bar) {}
}

您可以为层次结构中的每个派生类指定扩展方法,并为其提供特定的实现。

关于"编译器告诉你"一个扩展方法,我认为这是不可能的,因为扩展方法只是"语法糖"。扩展方法可以这样使用:

var foo = new BaseClass();
foo.DoExtension();

但实际上就像一个普通的静态类:

var foo = new BaseClass();
BaseClassExtensions.DoSomething(foo);

编译器不能警告你,你应该创建一个静态类,它的方法应该接受特定的类型