3

クラスに次の名前の変数がありますId

public class myClass
{
    GUID Id;
}

Idint 型または GUID 型のいずれかを取得するために、変数にポリモーフィズムを持たせるにはどうすればよいですか?

私はこのようなものが欲しいのですが、GUIDまたはintしか取得しません:

編集:

public class myClass
{
    Guid || int Id;
}

クラスの初期化時に int または Guid が定義されるようにします。

4

5 に答える 5

5

クラスをジェネリックにすることができます:

public class MyThing<T>
  where T : struct
{
  public T MyProperty { get; set; }
}

次に、次の方法で使用できます。

MyThing<GUID>
MyThing<int>

しかし、有効な答えを得るには、何を達成しようとしているのかを知ることが確かに役立ちます。

于 2013-06-05T09:05:19.027 に答える
3

ジェネリック クラスを使用できます。

public class MyClassName<TId>
{
  public TId Id { get; set; }
}

そして、次のように使用します。

int の場合:

var myObject = new MyClassName<int>();

ガイドの場合:

var myObject = new MyClassName<Guid>();
于 2013-06-05T09:05:47.000 に答える
0

なぜそれをしたいのかわかりませんが、もしそうしなければならない場合はどうですか:

public class
{
    object Id;
}

また

public class
{
   private int _intId;
   private GUID _guidId;

   public int GetIntegerGuid()
   { 
       return _intId;
   }

   public int GetGuid()
   { 
       return _guidId;
   }
}
于 2013-06-05T09:04:08.167 に答える
0

この場合、ポリモーフィズムはオブジェクトの継承に関連するものであるため、これを行うことはできません

ポリモーフィズムとは、オブジェクトが使用方法に応じてパブリック インターフェイスを変更する機能です。継承を使用する場合、親クラスのインスタンスが期待される場所で派生クラスのオブジェクトが置換されると、ポリモーフィズムが実現されます。これは、アップキャストと呼ばれるプロセスを使用します。アップキャストでは、より特殊化されたクラスのオブジェクトが、必要な基本クラスの型に暗黙的にキャストされます。

詳細はこちら

于 2013-06-05T09:11:53.660 に答える
0

必要なのは、unionCa またはF#の判別共用体型です。どちらも、 C#の優れた構文で定義することはできません。

このコードは、同様のシナリオで使用するためのジェネリック クラスを提供します。

public class Either<A, B>
{
    A _a;
    B _b;
    bool _isLeft;

    private Either() { }
    private Either(A a, B b, bool isLeft)
    {
        _isLeft = isLeft;

        if (_isLeft)
        {
            _a = a;
            return;
        }

        _b = b;
    }
    public Either(A a) : this(a, default(B), true) { }
    public Either(B b) : this(default(A), b, false) { }

    public A Left { get { return _a; } }
    public B Right { get { return _b; } }
    public bool HasLeft { get { return _isLeft; } }
}

HasLeftどの値が実際に存在するかを確認する必要があります。オブジェクト フィールドと、静的に型付けされた言語では避けたいキャストを使用することもできます。他にも可能な解決策があります(dynamicまたはを使用struct)が、これ(IMHO)で十分です。

注: もう 1 つの方法はcase class、 a からeach を派生させることbase classです。それについての悪いこと(私見)は、それぞれに個別のオーバーロードされた関数を提供する必要があることですcase class

于 2013-06-05T11:39:15.223 に答える