簡體   English   中英

C#中變量類型的多態性

[英]Polymorphism on type of Variables in C#

我在一個名為Id的類中有一個變量:

public class myClass
{
    GUID Id;
}

如何在Id變量上使用多態來獲取int類型或GUID類型?

我想要這樣的東西,但它只獲得GUID或int:

編輯:

public class myClass
{
    Guid || int Id;
}

我想要它,以便在類的初始化時定義int或Guid。

你可以使這個類通用:

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

然后可以使用以下方式:

MyThing<GUID>
MyThing<int>

但是為了給你一個有效的答案,肯定會有助於你知道你想要達到的目標。

您可以使用泛型類。

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

並像這樣使用它:

對於int:

var myObject = new MyClassName<int>();

對於Guid:

var myObject = new MyClassName<Guid>();

我不確定你為什么要這樣做,但如果你必須,那怎么樣:

public class
{
    object Id;
}

要么

public class
{
   private int _intId;
   private GUID _guidId;

   public int GetIntegerGuid()
   { 
       return _intId;
   }

   public int GetGuid()
   { 
       return _guidId;
   }
}

在這種情況下你不能這樣做,因為多態是與對象繼承相關的東西

多態性是對象根據其使用方式更改其公共接口的能力。 使用繼承時,如果派生類的對象被替換為期望其父類的實例,則實現多態。 這使用稱為向上轉換的過程。 通過向上轉換,更專業的類的對象被隱式轉換為所需的基類類型。

更多信息在這里

你想要的是C中unionF#中區別的聯合類型; 兩者都不可能在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以查看實際存在的值。 人們可以只使用一個對象字段和一些我寧願用靜態類型語言避免的轉換。 還有其他可能的解決方案(使用dynamicstruct )但這個(恕我直言)會這樣做。

注意:另一種方法是從base class派生每個case class base class 關於這一點的壞事(恕我直言)是你必須為每個case class提供一個單獨的重載函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM