1

プロジェクトで名前空間を定義するより良い方法を知りたいです。2 つの異なる winform プロジェクトがあり、両方のプロジェクトで使用する特定のコード ファイルとフォームがあります。したがって、プロジェクト 1 と 2 の構造は以下のとおりです。

//Project Pro1
//-------------------------------------
//Class C1 starts
#if pro1
using pro1
#endif
#if pro2
using pro2
#endif
namespace common_fun
{
Class C1
    Method M1
    {
        call to C2.M2
    }

}

//Class C2 starts
namespace pro1
{
Class C2
    Method M2

}

//Project Pro2
//----------------


#if pro1
using pro1
#endif
#if pro2
using pro2
#endif
namespace common_fun
{
Class C1
    Method M1
    {
        call to C2.M2
    }

}

namespace pro2
{
Class C2
    Method M2

}

したがって、ここでは、クラス C1 (名前空間 common_fun の下) は、両方のプロジェクトで使用される共有ファイルです。ただし、クラス C2 のメソッド M2 を呼び出す必要があり、そのメソッドを呼び出すには、条件付きの using ステートメントを一番上に記述する必要があります。すなわち

#if pro1
using pro1
#elseif pro2
using pro2
#endif

だから私の質問は、共通ファイルの名前空間を含めるためのより良い方法はありますか? 将来的には、同じクラス/フォームを使用する 3 ~ 4 個のプロジェクトが存在する可能性があります。

ありがとう。

4

2 に答える 2

1

両方のプロジェクトで使用する特定のコード ファイルとフォームがあります。

私の理解が正しければ、これらのコード ファイルを別のアセンブリに配置するのではなく、両方のプロジェクトで参照していると思います。「共通クラス」をそのようなライブラリに入れようとした場合 (再利用可能なコードを作成する場合のベストプラクティスであるため)、コンパイラ/リンカーがこれを許可していないことに気付くでしょう: 代わりに、C1 と C2 のすべてのバリアントの間の循環的な依存関係です。これは、異なるプロジェクト間で共有したいコードを作成するときは、絶対に避けるべきことです。なぜなら、コードをテストしにくくし、維持するのが難しくなるためです (名前空間の問題は、そのようなプロジェクトで発生する可能性のある典型的な問題の 1 つであるため、すでに気づいています)。状況)。

sacklpicka のソリューション (インターフェイスを使用) は、この問題を解決する 1 つの方法であり、C1 を独自のライブラリに配置できるようにします。もう 1 つは、単にM2のコンストラクターでデリゲートとして渡すC1か、M1 が呼び出されるたびにトリガーされるイベントを与えることです。これにより、C1 のユーザーはメソッドをイベント ハンドラーとしてC1登録できます。M2

于 2011-06-03T08:35:20.480 に答える
1

M2 メソッドを含む共通のインターフェイスを作成します。

 interface ICommonFun
 {
      void M2();
 }

C1次に、そのインターフェイスの実装をクラスに渡します。

 class C1
 {
      ICommonFun Instance;

      public void M1()
      { 
         Instance.M2();
      }

      public C1(ICommonFun fun)
      {
          Instance = fun;
      }
  }
于 2011-06-03T08:32:02.327 に答える