[解決済み】インターフェイス - ポイントは何ですか?
質問
インターフェースの存在意義がよくわからないのですが。私の理解では、C#には存在しない多重継承の回避策のようなものです(と、私は聞きました)。
私が思うに、いくつかのメンバーや関数をあらかじめ定義しておき、それをまたクラスで再定義しなければならないということです。そのため、インターフェースは冗長になっています。私には構文的な...いや、ガラクタのように感じられます(悪気はないのですが、ガラクタというのは役に立たないものという意味です)。
スタックオーバーフローのC#インターフェースのスレッドから引用した以下の例では、インターフェースの代わりにPizzaという基底クラスを作成します。
簡単な例 (別のスタックオーバーフローの投稿から引用)
public interface IPizza
{
public void Order();
}
public class PepperoniPizza : IPizza
{
public void Order()
{
//Order Pepperoni pizza
}
}
public class HawaiiPizza : IPizza
{
public void Order()
{
//Order HawaiiPizza
}
}
解決方法は?
ポイントは、インターフェイスが表す コントラクト . 実装クラスが持つべきパブリックメソッドのセットです。技術的には、インターフェースは構文のみを規定します。つまり、どのようなメソッドがあり、どのような引数を得て、何を返すのかを規定します。通常、インターフェイスはセマンティクスもカプセル化しますが、それはドキュメントによってのみです。
そして、あるインターフェイスの異なる実装を持ち、それらを自由に入れ替えることができます。この例では、すべてのピザのインスタンスが
IPizza
を使用することができます。
IPizza
未知のピザ型のインスタンスを処理する場合、どこでもよい。を継承したインスタンスは
IPizza
は注文可能であることが保証されています。
Order()
メソッドを使用します。
Pythonは静的型付けをしないので、型は保持され、実行時にルックアップされます。そのため
Order()
というメソッドがあります。ランタイムは、そのオブジェクトがそのようなメソッドを持っている限りは満足し、そうでない場合は、おそらく「メー」と肩をすくめるだけだろう。C#ではそうではない。コンパイラは正しい呼び出しを行う責任があり、もし適当な
object
実行時にインスタンスがそのメソッドを持つかどうか、コンパイラはまだ知らないのです。コンパイラからすれば、それを検証できないので無効なのだ。(このようなことは、リフレクションや、あるいは
dynamic
というキーワードがありますが、今はちょっと遠回りしていますね)
また、通常の意味でのインターフェースは、必ずしもC#の
interface
これは、すべてのサブクラスが共通のコードを共有する必要がある場合に便利です - ほとんどの場合、しかし。
interface
で十分です)。
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] C#のインターフェイス。暗黙の実装と明示の実装
-
[解決済み】TypeScriptのインターフェースと型について
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
-
[解決済み】「インターフェースに合わせたプログラム」とはどういう意味ですか?
-
[解決済み】PHPのインターフェイスのポイントは何ですか?
-
[解決済み】オブジェクト指向のパラダイムにおける疎結合と密結合の違いは何ですか?