Zastanawiam się, czy istnieje sposób, w języku C#, mieć typ oparty na typie pierwotnym i powielać go, aby zamiast tego używać innych prymitywów.Dyskusja na temat ogólnego typu numerycznego w C#
Wiem, że to niezbyt jasne, naprawdę nie wiem jak to wyjaśnić (a angielski nie jest moim ojczystym językiem, przepraszam za to ...), więc spróbuję wyjaśnić to za pomocą pseudo- kod.
Szybki przykład:
public struct Vector2d {
public double X;
public double Y;
//Arithmetic methods: Length, normalize, rotate, operators overloads, etc...
}
Problemem jest to, że chciałbym mieć pływak oraz wersję Int32 tego typu.
co robię faktycznie (kod ważny 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);
}
}
To działa, ale to nie jest „sexy”, a w przypadku rozległych odlewów z zastosowaniem metody AsXXX, nie będzie nieuchronnie wpływ na występy.
Idealnie, chciałbym mieć arytmetyki methodes na wszystkich trzech typach, ale byłoby to ból do utrzymania ...
Co byłoby idealne rozwiązanie (pseudo-code, nie ważne 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
}
wiem, że to nie jest możliwe w języku C# na chwilę, ale tutaj jest prawdziwe pytanie:
Czy masz jakiś pomysł, jak ładnie i sprawnie sobie z tym poradzić?
Co myślałem do (pseudo-code, nie ważne C#): Kod
//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
}
ten sposób bym nie powtarzają, łatwiejsze do utrzymania
czeka na swoje pomysły :)
PS: Jeśli moderator mają pomysły na lepsze formatować moje pytanie, nie krępuj się go :) edytować
myślę 'Vector2 gdzie T: IConvertible' –
Jodrell
Istnieją sposoby, wystarczy wyszukać "[C#] [generycznych] Numery", a otrzymasz wiele wyników. Ale będzie to miało poważny wpływ na wydajność. A biorąc pod uwagę, że chcesz pracować z wektorami, tutaj najważniejsza jest wydajność. – Euphoric
możliwe duplikat [C#: ogólnego interfejsu dla numerów] (http://stackoverflow.com/questions/1325131/c-generic-interface-for-numbers) – Euphoric