繁体   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