5

.NET で入れ子になった型が関係する特定のシナリオに関しては、どのような良い習慣があるのか​​知りたいです。

Wheel クラスがあり、Wheel クラスが Bearing オブジェクトを保持しているとします。Bearing オブジェクトは Wheel 内でのみ意味があり、独立して作成することは望ましくないため、Bearing クラスを Wheel オブジェクト内にネストすることは理にかなっています。ただし、Wheel クラスの外部で Wheel.Bearings プロパティを読み取る必要があるシナリオがあるとします。これには、ネストされた Bearing クラスを public にする必要があります。

この状況では、最良の選択肢は何ですか?
1 - Wheel クラス内にネストされた public Bearing クラス
を作成します。 2 - コンストラクターで Wheel オブジェクトを受け取る独立した Bearing クラスを
作成します。 3 - Wheel 名前空間を作成し、この名前空間内に独立した Bearing クラスを作成します。
4 - 他に何か?

更新: 詳細を更新し、これまでのいくつかの提案を反映させます。ClassParent は親クラス、ClassChild は子クラスです。ClassChild は常に ClassParent の子であり、単独で存在する意味はありません。問題は、ClassChild にはパブリックに公開する必要があるいくつかのプロパティがあり、残りはすべて ClassParent からのみ呼び出す必要があることです。例としては、ClassParent が適切なクリーンアップと変更を実行する必要があるため、ClassParent からのみ呼び出す必要があるため、公開すべきではない ClassChild.Delete 関数があります。

提案を確認した後、私が思いついたデザインは少し汚れているように見えるので、意見を求めようと思いました. 私は持っている:

public class Parent
{
  ChildNested childObj

  public DeleteChild()
  {   
      //expose this method publically
      childObj.DeleteChild()
      //other functionality 
  }

  public Child GetChild()
  {
      //expose Child, not ChildNested publically
      return childObj
  }

   private class ChildNested:Child
   {
         public Child()
         {
              Base.Child()
         }
         public DeleteChild()
         {
              Base.Delete()
         }
   }

public abstract class Child
{
 protected Child()
     {
     }
 protected Delete()
     {
     }
     public PublicPropertyToExpose()
     {
     }    
}
4

4 に答える 4

8

ここでの最適な設計はBearing、コンストラクターを使用してパブリック クラスを作成internalし、クラス内でそのインスタンスを作成することWheelです。

Bearingクラスがクラスのプライベート メンバーにアクセスする必要がある場合はWheel、パブリックBearingクラスを作成してから、内部のネストされたクラスabstractとして具体的な実装を作成できます。privateWheel

一般に、ネストされた型は作成しないでくださいpublic

于 2010-03-10T17:06:23.377 に答える
1

ベアリングは、ホイールの外で、世界の他の場所で使用するのにおそらく十分に役立つので、それ自体で存在することができます。

ホイールはベアリングを使用して集約されますが、ホイールはベアリングを定義しません。ベアリングは便利で、ホイール以外にも使用できます。

Bearingにパブリックプロパティが必要であるという事実は、それがWheelの外部のパブリッククラスである必要があることを示しています。

また、Wheelを再発明するとどうなりますか(私たち全員が行います...)。マイクロタービンに存在するような新しい「エアベアリング」を使用しているかもしれませんが、Wheelクラス内に複数のベアリングタイプがあり、そのうちのいくつかは使用されていません。

Bearingを同じ名前空間内に配置しますが、Wh​​eelクラス内には配置しません。内部クラスが必要になることはめったにありません。通常、匿名のクラスは私が必要とするギャップを埋めます。

于 2010-03-10T17:15:44.483 に答える
1

「ベアリング」を単独でテストしたいので、2番目のオプションを選択します。

于 2010-03-10T17:09:35.207 に答える
1
  • プライベート コンストラクターを使用して独立した Bearing クラスを作成する
  • Wheel クラスを指定して Bearing クラスをインスタンス化するファクトリ クラスを作成します。
于 2010-03-10T17:06:48.793 に答える