0

さまざまな意味を持つ多くの整数を持つコードがたくさんあります(一般的な解決策が必要ですが、特定の例では、月の日と月と年など)。これらの意味に基づいて、クラス コンストラクターをオーバーロードできるようにしたいと考えています。

例えば

int a; // takes role A
int b; // takes role B

var A = new Foo(a);  // should call one constructor
var B = new Foo(b);  // should call another constructor

明らかにそれは機能しませんが、int次のような名前以外のタイプ(エイリアスだけでなく)を定義できれば:

typedef int TypeA;  // stealing the C syntax
typedef int TypeB;

必要なオーバーロードを行い、型システムに何が何であるかを追跡させることができます。特に、これにより、値が混同されていないことを確認できます。たとえば、関数から年として返された値は月の日として使用されません。

classC#でこれを行う方法またはstructラッパーが足りない方法はありますか?


このソリューションが float と double に対しても機能するとよいでしょう。

4

4 に答える 4

13

typedef に直接相当するものはありませんが、次のことができます。

using TypeA = int;
using TypeB = int;

ただし、これは新しい厳密な型を作成するのではなく、型のエイリアスを作成するだけです。したがって、コンパイラはintメソッド呼び出しを解決するときにそれらを として扱います。

intより良い解決策は、次のような暗黙的なキャストをラップして提供する単純なラッパー クラスを作成することです。

struct TypeA
{
   public TypeA(int value)
   {
      this.realValue = value;
   }

   private int realValue;
   public static implicit operator int(TypeA value)
   {
     return this.realValue;
   }

   public static implicit operator TypeA(int value)
   {
     return new TypeA(value);
   }
}

ただし、ほとんどの場合、 のenum方が適切です。

于 2009-02-18T20:58:28.970 に答える
6

これはかなり遠いかもしれませんが、これに列挙型を使用できませんでしたか?列挙型ベースはintですが、型指定されており、渡された列挙型の型に基づいてさまざまなコンストラクターを定義できます。

于 2009-02-18T20:44:03.573 に答える
2

コンストラクターだけの場合は、次のようなものを使用できませんでした:

 int dom = 5;
int doy = 100;

Foo b = Foo.NewFromDayoftheMonth(dom);

Foo c = Foo.NewFromDayoftheYear(doy);

各メソッドは静的であり、渡されたパラメーターに基づいて新しい Foo オブジェクトを作成します。

これは、他にあまりない解決策のように思えます。

于 2009-02-18T20:51:34.883 に答える