質問

.NET アプリケーションにプラグインのサポートを追加しています。基本クラスは合理的だと私には思われるので、人々はそれを継承でき、 オーバーライド 特定の呼び出しでは、デフォルトの機能を維持したり、内部ヘルパー関数を使用したりすることもできます。

継承する基本プラグイン クラスではなくインターフェイスを選択するのはなぜですか?どのデザインを選択すべきか、またその理由を教えていただけますか?

役に立ちましたか?

解決

あなたはSystem.Addin(MAF)名前空間またはマネージド拡張フレームワーク(MEF)を見てみ検討すべきです。 MEFは、MAFよりもはるかに簡単であるとして、それはまだリリース前であっても好ましい選択肢となります。いずれかのこれらの選択肢の一つは、あなたがロードされたアドインを取得し、それらと対話するために行う必要があります配管多くの作業を簡素化します。

あなたはMAFまたはMEFで行く場合は、

限りインターフェースと抽象クラスの間で選択を行うなど、そのうちのいくつかはあなたのために作られます。この文脈の中で最も基本的な違いは、抽象基本クラスを提供することで、あなたは(あなたや他の開発者のいずれかによって書かれた)カスタムプラグインの継承点を提供していること、および特定のメソッド/プロパティは、デフォルトの動作を提供し、特定の実装に派生クラスを強制していることを確認必要なメソッド/プロパティ。欠点は、あなたは、単一の基底クラスに限定されていることです。

インターフェイスは、単一の基本クラスの制限を回避し、依然として、カスタムプラグインのinhertiance点を提供し、特定の方法/プロパティが実装されているが、既定の動作の任意の型を提供することができないことを確認してください。抽象クラスは、抽象または仮想非パブリックメンバを持つことができますが、あなたはまた、インタフェースのパブリックメンバー以外を指定することはできません(通常は保護されています)。

他のヒント

プラグインの契約のためのインターフェースを使用してください。特定の機能可能性が高い株式をプラグインの特定のタイプの場合は、インタフェースを実装する抽象基本クラスを作ります。また、あなたの契約は、あなたの実際のアプリケーションの外部アセンブリにあることを確認します。

.NETに、あなたは多重継承を持っていないことに注意してください。 を彼らのために少し機能を提供するために彼らの継承スロットを放棄するの実装を要求することは良いアイデアではありません。

なぜ、それはどちらか一方であることを持っていますか?

あなたは、プラグインはどこでも参照されているインタフェースとして従わなければならない契約を定義することができます。

プラス、あなたもそのインタフェースを実装していますが、単にあなたがデフォルトの実装を提供することができないのインタフェース機能のいくつかのために呼び出される抽象メソッドを持つ基本クラスを定義することができます。

public interface IPlugin
{
    void Initialize ();
    void Stuff ();
}

public class PluginBase : IPlugin
{
    protected abstract DoInitialize ();
    protected abstract DoStuff ();

    void IPlugin.Initialize { this.DoInitialize (); }
    void IPlugin.Stuff { this.DoStuff (); }
}

ここでは、このトピックには良い記事があります: プラグインAPIの設計

私は個人的にインタフェースを使用し、プラグインはすべての詳細を実装して聞かせています。

あなたがすべき明白なことは、プラグインが処理したい個々のイベントのコールバック (デリゲート) を登録できるようにすることだと思います。これは、.net でのほとんどのフレームワークの動作方法です。

言い換えれば、基本クラスもインターフェイスもありません。このソリューションの利点は、プラグインが特定の外部インターフェイスや基本クラスに準拠する必要がなく、必要な機能を登録するだけであることです。

例として、特定の asp.net コントロールの「イベント」セクションは次のように処理します。見て ユーザーコントロール

誰もが言及するのを忘れている何かが後方互換性です。あなたがそれらに影響を与えることなく、既存のインタフェースを変更することはできませんしながら、既存のクライアントを壊すことなく、基本クラスに新しいメソッドを追加することができます。

インタフェースとの互換性の問題を回避するための選択肢があります。たとえば、あなたがあなたのアプリケーションのための新しい拡張機能が含まれ、古いものから継承する新しいインターフェイスを作成することができます。しかし、これは、このようなIClientInterfaceV2やIClientInterfaceV3などの型を使用してアーキテクチャを膨満という欠点を持っています。

私の個人的な提案は、のscwagner のによって提案されたようなアプローチで行くと、基本クラスとインターフェイスの両方を作成することです。そして、将来のバージョンでは、その実施を破ると、基本クラスの継承戦略は、将来の互換性の問題を回避するために推奨される一つであることかもしれないことを示すインタフェースユーザーに警告を含んでます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top