次のような WidgetBase という抽象基本クラスがあります。
public abstract class WidgetBase : Control, INamingContainer
{
// This class declares abstract and virtual properties and methods but doesn't override anything
}
次のような ScrollerBase という別の抽象基本クラスがあります。
public abstract class ScrollerBase : Control
{
// This class has one abstract property and overrides OnInit and OnLoad
}
これらの両方のクラスを継承するクラスを作成する必要があります。どちらのクラスもインターフェイスに変換できません。私が考えることができる最も簡単な解決策は、次のような追加の WidgetBase クラスを作成することです。
public abstract class ScrollingWidgetBase : ScrollerBase, INamingContainer
{
// Lots of duplicated code from WidgetBase
}
次のようなことができればいいのですが。
public abstract class ScrollingWidgetBase : WidgetBase<ScrollerBase> { /* Empty */ }
public abstract class WidgetBase : WidgetBase<Control> { /* Empty */ }
public abstract class WidgetBase<T> : T, INamingContainer { /* Code goes here */ }
ただし、これは不可能です。私が考えることができる唯一の半分エレガントなソリューションは、次のようなものです。
public interface IScroller { /* Overridable members go here */ }
public class WidgetBase : Control, INamingContainer
{
protected override void OnInit(EventArgs e)
{
if (this is IScroller)
{
// Do scroller logic here
}
}
protected override void OnLoad(EventArgs e)
{
if (this is IScroller)
{
// Do scroller logic here
}
}
}
public class Test : WidgetBase, IScroller { }
ただし、より多くのクラスが作成されると、これは非常に面倒になります。確かに、この問題を解決する何らかの設計パターンがあるはずですか? どんな助けでも大歓迎です。
ありがとう、
ジョー