扩展类层次结构

时间:2015-07-28 06:35:12

标签: c# inheritance extension-methods abstraction

我有一个抽象的基类:

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

    public abstract double MethodThatMustBeDefinedInSubClasses(double parameter);
}

下面有一个类层次结构。

我想在另一个程序集中为Base类及其子类创建一个Extension类。我想用静态类做一个方法,该方法接收参数:

public static Method(this BaseClass, ...)

但是我希望为BaseClass中的所有子类定义这个静态方法。我知道我不能做一个静态的抽象方法,但是我想避免在类本身中实现这些方法......编译器告诉我"这将是非常好的。必须为子类重新定义这些方法。

2 个答案:

答案 0 :(得分:1)

  

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

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

  

编译器“告诉我”这些方法必须为子类重新定义,这将是非常好的。

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

答案 1 :(得分:1)

这是你想要的吗?

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);

并且编译器不能警告您应该使用应该接受特定类型的方法创建静态类。