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
您可以将类设置为泛型:
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
以查看实际存在的值。可以只使用对象字段和一些强制类型转换,这是我在静态类型语言中避免使用的。还有其他可能的解决方案(使用dynamic
或struct
),但这(IMHO)将做。
注:另一种方法是从base class
派生每个case class
。不好的事情(再次IMHO)是你必须为每个case class
提供一个单独的重载函数。