[解決済み] なぜC#は静的メソッドにインターフェイスを実装できないのか?
2022-03-22 03:06:51
質問
C#はなぜこのように設計されたのですか?
私の理解では、インターフェースは振る舞いを記述するだけであり、インターフェースを実装するクラスに対して、ある振る舞いを実装するという契約上の義務を記述する目的を果たすものです。
もしクラスがその振る舞いを共有メソッドで実装したいと望んだら、なぜそうしてはいけないのでしょうか?
以下はその例です。
// These items will be displayed in a list on the screen.
public interface IListItem {
string ScreenName();
...
}
public class Animal: IListItem {
// All animals will be called "Animal".
public static string ScreenName() {
return "Animal";
}
....
}
public class Person: IListItem {
private string name;
// All persons will be called by their individual names.
public string ScreenName() {
return name;
}
....
}
解決方法は?
なぜできないのか、という質問を想定して。
public interface IFoo {
void Bar();
}
public class Foo: IFoo {
public static void Bar() {}
}
これでは意味不明です。 インターフェイスで指定されるメソッドは、オブジェクトと対話するための契約を指定するために存在するはずです。 静的なメソッドは、オブジェクトと対話することを許しません。もし、あなたの実装が静的にされうる立場にあることに気づいたら、そのメソッドが本当にインターフェースに属しているのか、自問する必要があるかもしれません。
あなたの例を実装するには、Animal に const プロパティを与えて、静的コンテキストからアクセスできるようにし、実装でその値を返します。
public class Animal: IListItem {
/* Can be tough to come up with a different, yet meaningful name!
* A different casing convention, like Java has, would help here.
*/
public const string AnimalScreenName = "Animal";
public string ScreenName(){ return AnimalScreenName; }
}
もっと複雑な場合は、別の静的メソッドを宣言して、それに委譲することもできます。 しかし、静的なコンテキストとインスタンスコンテキストの両方で自明でないことを行う理由は思いつきませんでしたので、FooBarの塊は割愛し、良いアイデアではないことを示すものとします。
関連
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み] 2つのリストを結合する
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] あるインタフェースを実装しているすべての型を取得する
-
[解決済み] 既存の静的クラスに拡張メソッドを追加することはできますか?
-
[解決済み] 匿名クラスはインターフェースを実装できますか?
-
[解決済み] インターフェイスには正しいメソッドを持つ以上のものがあるのか
最新
-
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#.
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。