C#のプライベートインナークラス - なぜもっと使われないのか?
2023-09-02 11:12:26
疑問点
私はC#の比較的新しい人間ですが、C#のプロジェクトに取り組み始めるたびに(C#ではほぼ成熟したプロジェクトしか手がけたことがありません)、なぜインナークラスがないのだろうか?
たぶん、私は彼らの目標を理解していないのでしょう。私にとっては、内部クラス (少なくともプライベート内部クラス) は Pascal や Modula-2 や Ada における "inner procedures" によく似ています。
例: ほとんどの場合、次のようなものがあります。
public class ClassA
{
public MethodA()
{
<some code>
myObjectClassB.DoSomething(); // ClassB is only used by ClassA
<some code>
}
}
public class ClassB
{
public DoSomething()
{
}
}
ClassBは(少なくともしばらくの間は)ClassAによってのみ使用されるので、このコードは以下のように表現するのが良いのではないかと思います。
public class ClassA
{
public MethodA()
{
<some code>
myObjectClassB.DoSomething(); // Class B is only usable by ClassA
<some code>
}
private class ClassB
{
public DoSomething()
{
}
}
}
このテーマについてお聞かせいただければ幸いです - 私の考えは正しいでしょうか?
どのように解決するのですか?
ネストされたクラス (C# のネストされたクラスは Java の内部クラスと多少異なるため、おそらく "inner" という言葉は避けたほうがよいでしょう) は確かに非常に便利です。
言及されていないパターンとして、"better enum"パターンがあり、これはJavaのものよりもさらに柔軟であることができます。
public abstract class MyCleverEnum
{
public static readonly MyCleverEnum First = new FirstCleverEnum();
public static readonly MyCleverEnum Second = new SecondCleverEnum();
// Can only be called by this type *and nested types*
private MyCleverEnum()
{
}
public abstract void SomeMethod();
public abstract void AnotherMethod();
private class FirstCleverEnum : MyCleverEnum
{
public override void SomeMethod()
{
// First-specific behaviour here
}
public override void AnotherMethod()
{
// First-specific behaviour here
}
}
private class SecondCleverEnum : MyCleverEnum
{
public override void SomeMethod()
{
// Second-specific behaviour here
}
public override void AnotherMethod()
{
// Second-specific behaviour here
}
}
}
ここでは紹介していませんが、実際にはすべての値に対して入れ子クラスを使用しないとか、複数の値に対して同じ入れ子クラスを使用し、それぞれに異なるコンストラクタ引数を与えるなど、多くのオプションがあります。しかし基本的には、入れ子クラスが private コンストラクタを呼び出すことができるという事実が、多くの力を与えてくれるのです。
関連
-
[解決済み】C#で四捨五入する方法
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み] 2つのリストを結合する
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
-
[解決済み] 匿名)内部クラスを使用することがリークセーフとなるのは、具体的にどのような場合ですか?
-
[解決済み] なぜ外側の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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] C#とJavaのEnumの比較(C#を初めて使う人向け)