ネストされたクラスをどこでどのように使用するのでしょうか?[重複]
-
01-10-2019 - |
質問
この質問にはすでに答えがあります:
クラスが別のクラス内でのみインスタンス化される場合、そのクラス内でネストして使用するのが正しいと考えています。これは良い設計に役立つと思います。自分のプロジェクトを見ると、そのようなネストされた構造はほとんど見たことがありません。しかし、クラスを入れ子にしようとすると、今度は別の疑問が頭に浮かびます。たとえば
Boardクラス、ShortCastle、LongCastle、EnPassant、PromoteなどのMoveクラス、およびPawn、Queen、Rook、Knightなどの駒があります。したがって、Board クラスが Piece クラスをインスタンス化し、Piece クラスが Move クラスをインスタンス化することは明らかです。良いデザインを実現するには、ポーンのみが自身を昇格できるため、昇格移動クラスをポーンのネストにする必要があります。キングのみがそのようなタイプの移動を実行できるため、短い城と長い城はキングのネストにする必要があります。
すべての Piece クラスを Board クラスに入れようとすると、デザインが良くありません。8 ~ 9 クラスが Board クラス内にあるため、1 つの Board クラス ファイルが大きすぎて読みにくくなり、非常に面倒になります。各ピース クラスを別のクラスに保持することをお勧めします。ファイル。部分ボード クラスを作成できるのは良いことですが、それでも面倒ではありませんか。8 ~ 9 部分ボード クラス ファイルは各ピース クラスを保持します。入れ子にしない方が良いのでしょうか?駒についても同様 別の技タイプクラスのためだけに別の部分駒ファイルを作成しますか?ネストされたクラスが小さなスペースしか必要としない場合は問題ありませんが、多くのメソッドを必要とする場合はどうでしょうか。
解決
入れ子クラスについては寛大すぎると思います。見て これ ネストされた型の設計ガイドライン。
以下に該当する場合は、ネストされた型を使用しないでください。
- タイプはクライアントコードでインスタンス化する必要があります。タイプにパブリックコンストラクターがある場合、おそらくネストされるべきではありません。このガイドラインの背後にある理論的根拠は、ネストされたタイプをインスタンス化できる場合、タイプがそれ自体でライブラリに場所があることを示すということです。外側のタイプを使用せずに作成し、使用し、破壊することができます。したがって、ネストするべきではありません。内側のタイプは、外側のタイプとの関係がなければ、外側のタイプの外で広く再利用してはなりません。
- タイプへの参照は、一般にクライアントコードで宣言されています。
駒はボード (メンバーとしての駒コレクション?) に属している可能性がありますが、ボードなしでも共存できます。そう感じるかもしれません。駒(テーマなど)のないボードを再利用したい、またはボードのない駒(ポジションなど)も再利用したい。
他のヒント
????????????????????????????????????????
????????????????????????????????
?????????????????????????????????????????????????????????????????
????????????????>???????????????????????????????????????????????????????????????????????????????
(???Schmelter??????)??????????????????????????????????????????????????????defintions????????????????????????????????????????????????????1?????????????????????????????
Parent.cs??:
public partial class Parent
{
void SomeMethod()
{
Nested1 n1 = new Nested1();
Nested2 n2 = new Nested2();
}
}
Nested.cs??:
public partial class Parent
{
private class Nested1
{
}
private class Nested2
{
}
}
ネストされたクラスには適切な役割がありますが、操作が混乱する可能性があります。いくつかの .Net クラスを使用して Facebook のウォール投稿の JSON 出力を取得する方法を示す Web ページを見つけました。 http://www.virtualsecrets.com/graph-api-json-facebook-handler.html ここで興味深いのは、クラスがクラス内、他のクラス内にネストされているということです。そのため、少し複雑ですが、それが可能です。:)