我想知道在 C# 中是否有一种方法可以拥有基于原始类型的类型,并将其复制以使用其他原始类型。
我知道这不是很清楚,我真的不知道如何解释这个(英语不是我的母语,对不起......),所以我会尝试使用伪代码来解释它。
一个简单的例子:
public struct Vector2d {
public double X;
public double Y;
//Arithmetic methods: Length, normalize, rotate, operators overloads, etc...
}
问题是我想要这种类型的 float 和 int32 版本。
我实际上在做什么(有效的 C# 代码):
//This type contains all useful methods
public struct Vector2d {
public float X;
public float Y;
public Vector2f AsFloat() {
return new Vector2f((float)X, (float)Y);
}
public Vector2f AsInteger() {
return new Vector2i((int)X, (int)Y);
}
//Arithmetic methods
}
//These types are only here to be casted from/to, all the arithmetics methods are on the double-based type
public struct Vector2f {
public float X;
public float Y;
public Vector2f AsDouble() {
return new Vector2d(X, Y);
}
public Vector2f AsInteger() {
return new Vector2i((int)X, (int)Y);
}
}
public struct Vector2i {
public int X;
public int Y;
public Vector2f AsFloat() {
return new Vector2f(X, Y);
}
public Vector2f AsDouble() {
return new Vector2d(X, Y);
}
}
它有效,但并不“性感”,并且在使用 AsXXX 方法进行大量演员表的情况下,不可避免地会对表演产生影响。
理想情况下,我会对所有三种类型都有算术方法,但维护起来会很痛苦......
什么是理想的解决方案(伪代码,无效的 C#):
public struct Vector2<T> where T : numeric {
public T X;
public T Y;
public T Length {
return (T)Math.Sqrt(X * X + Y * Y);
}
//Other arithmetic methods
}
我知道目前在 C# 中这是不可能的,但这是真正的问题:
您对如何妥善有效地处理此问题有任何想法吗?
我一直在想的(伪代码,无效的 C#):
//The TYPE defined constant should be used by Vector2Body instead of plain typed "double", "float", etc...
public struct Vector2d {
#define TYPE double
#import Vector2Body
}
public struct Vector2f {
#define TYPE float
#import Vector2Body
}
public struct Vector2i {
#define TYPE int
#import Vector2Body
}
这样,我不会有重复的代码,更容易维护
等待你的想法:)
PS:如果版主对如何更好地格式化我的问题有想法,请随时编辑它:)