[解決済み】C#の多重継承について
質問
多重継承は良くない(ソースが複雑になる)ので、C#はこのようなパターンを直接提供しない。しかし、この機能があると便利なことがある。
例えば、私はインターフェースと3つのクラスを使って、足りない多重継承のパターンを実装することができます。
public interface IFirst { void FirstMethod(); }
public interface ISecond { void SecondMethod(); }
public class First:IFirst
{
public void FirstMethod() { Console.WriteLine("First"); }
}
public class Second:ISecond
{
public void SecondMethod() { Console.WriteLine("Second"); }
}
public class FirstAndSecond: IFirst, ISecond
{
First first = new First();
Second second = new Second();
public void FirstMethod() { first.FirstMethod(); }
public void SecondMethod() { second.SecondMethod(); }
}
インターフェースの1つにメソッドを追加するたびに、クラスを変更する必要があります。 FirstAndSecond を使用します。
C++で可能なように、複数の既存クラスを1つの新しいクラスにインジェクトする方法はありますか?
もしかしたら、何らかのコード生成を使った解決策があるのでは?
あるいは、こんな感じかもしれません(架空のC#構文)。
public class FirstAndSecond: IFirst from First, ISecond from Second
{ }
インターフェイスの1つを変更したときに、FirstAndSecondクラスを更新する必要がないようにするためです。
EDIT
実例で考えたほうがいいかもしれませんね。
既存のクラス(例:ITextTcpClientをベースにしたテキストベースのTCPクライアント)があり、プロジェクト内のさまざまな場所ですでに使用しています。 今、あなたは、Windowsフォームの開発者が簡単にアクセスできるように、そのクラスのコンポーネントを作成する必要性を感じています。
私の知る限り、現在これを行うには2つの方法があります。
-
FirstAndSecondで示したように、TextTcpClientクラスのインスタンスを用いて、componentsを継承した新しいクラスを作成し、そのインターフェイスを実装してください。
-
TextTcpClientを継承し、何らかの方法でIComponentを実装した新しいクラスを書きなさい(まだ実際に試していません)。
どちらの場合も、クラス単位ではなく、メソッド単位で作業をする必要があります。TextTcpClientとComponentのすべてのメソッドが必要なことが分かっているので、この2つを1つのクラスにまとめるのが最も簡単な解決方法でしょう。
コンフリクトを避けるために、結果を後から変更できるコード生成で行うこともできますが、手書きでこれを入力するのは本当に面倒くさいです。
解決方法は?
<ブロッククオート多重継承は良くない(ソースが複雑になる)ので、C#はこのようなパターンを直接提供しない。しかし、この機能があると便利なことがある。
C#と.net CLRがMIを実装していないのは、C#、VB.net、その他の言語間でどのように相互運用するかまだ結論が出ていないからであり、「ソースを複雑にする」ことが理由ではありません"quot。
MIは有用な概念ですが、未解決の問題は、次のようなものです。
Perlは、私がこれまでに扱った言語の中で、MIが機能し、うまく機能する唯一の言語です。CLRはすでにMIをサポートしていますが、私が言ったように、それ以上の言語構成はまだありません。
それまでは、Proxyオブジェクトと複数のInterfacesで代用することになります :(
関連
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である