簡體   English   中英

擴展類層次結構

[英]Extending class hierarchy

我有一個抽象基類:

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的所有子類定義此靜態方法。 我知道我不能做一個靜態的抽象方法,但我想避免在類本身中實現這些方法。這很好,編譯器“告訴我”必須為子類重新定義這些方法。 。

但是我希望為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);

而且編譯器無法警告您應該使用應接受特定類型的方法來制作靜態類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM