c#中变量类型的多态性

本文关键字:多态性 类型 变量 | 更新日期: 2023-09-27 18:17:13

我在一个类中有一个变量,名称为Id:

public class myClass
{
    GUID Id;
}

我如何在Id变量上具有多态性以获得int类型或GUID类型?

我想要这样的东西,但它只能得到GUID或int:

编辑:

public class myClass
{
    Guid || int Id;
}

我希望在类初始化时定义int或Guid

c#中变量类型的多态性

您可以将类设置为泛型:

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中的union 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以查看实际存在的值。可以只使用对象字段和一些强制类型转换,这是我在静态类型语言中避免使用的。还有其他可能的解决方案(使用dynamicstruct),但这(IMHO)将做。

注:另一种方法是从base class派生每个case class。不好的事情(再次IMHO)是你必须为每个case class提供一个单独的重载函数。