0

プロジェクトには、同じコンストラクターの基本セットと 1 つのパブリック メソッドが必要なクラスが多数あります。以下は、この部分クラスの例です。

public partial class SHIPMENT_LINE
{
     private OracleConnection _rp = null;
     private EntityConnection _rpe = null;
     private static string _schema = "";

     public SHIPMENT_LINE() { }

     public SHIPMENT_LINE(BHLibrary.Configuration.ConnectionOption Environment)
     {
         SetConnection(Environment);
     }

     public void SetConnection(BHLibrary.Configuration.ConnectionOption Environment)
     {
         this._rp = Configuration.RPConnection(Environment);
         this._rpe = Configuration.RPEntityConnection(Environment, out _schema);
     }
}

SetConnection作成するクラスごとに、同じプライベート変数、コンストラクター、およびメソッドを実装する必要があります。このすべてが各クラスに存在した後、各クラスは何か異なることを行うため、すべてのクラスが同じ「始まり」を持っているという事実を除けば、必ずしもすべてのクラスが関連しているわけではありません。

SetConnection作成する各クラスでこのメソッドを実装する必要がないように、これらの各クラスを構築するにはどうすればよいですか?

次の点に注意してください。

  • 他の制限により、これらのクラスの別のクラスから継承することはできません。ただし、必要に応じてインターフェイスを使用できます。
4

3 に答える 3

2

サブクラス化できない場合、抽象クラスは実行可能なソリューションではなく、インターフェイスは、実装なしで共通クラスが準拠するコントラクトを提供するだけです。

共通の機能を共通のクラスに実装し、これを他のクラスのプライベートメンバーとして使用することをお勧めします(継承ではなくIE構成)。他のクラスはすべてインターフェイスを実装して、すべてが同じメソッドを持つようにし、呼び出しをメソッドのプライベートクラス実装に転送することができます。

例えば

private MYClassWithCommonFunctionality xyz = new MYClassWithCommonFunctionality();

その後...

Private void MyCommonInterfaceMethod(object param)
{
    // Do derived class specific stuff here...
    xyz.MyCommonInterfaceMethod(param);
}

そして、追加のボーナスと少し前向きな考え方として....共通のクラスも同じインターフェイスを共有し、これの実装を他のクラスのコンストラクターに渡します。そうすれば、将来、実装を別の実装に交換できます。

于 2012-05-29T19:04:19.817 に答える
2

継承よりも作曲に行くことをお勧めします...

各クラスにインターフェイスを実装させてから、別のクラス(これらに関連しない)を作成します。このクラスもインターフェイスを実装し、具体的な実装を行います。上記のすべてのクラスには、この追加のクラスのインスタンスがあり、それを呼び出すだけです。

public partial class SHIPMENT_LINE : ISetConnection
{
   private ConnectionSetter connector = new ConnectionSetter();

   public void SetConnection(BHLibrary.Configuration.ConnectionOption Environment)
   {
      this.connector.SetConnection(Environment);
   }
}

public class ConnectionSetter : ISetConnection
{
    public void SetConnection(BHLibrary.Configuration.ConnectionOption Environment)
   {
      // Implementation
   }
}
于 2012-05-29T19:06:15.307 に答える
1

共通の機能を実装する基本クラスを作成できない場合 (何らかの理由でしょうか?)、おそらく T4 テンプレートを使用して、共通のメソッドで部分クラスを生成できます。

于 2012-05-29T19:02:38.927 に答える