Есть ли технология дифференцированного класса поведения на общих типах?
-
30-09-2019 - |
Вопрос
Я хотел бы сделать что-то вроде следующего, но потому что Т по сути просто System.Object. Это не будет работать. Я знаю Т Может быть ограничен интерфейсом, но это не вариант.
public class Vborr<T> where T : struct
{
public Vborr()
{
public T Next()
{
if ( typeof( T ) == typeof( Double ) )
{
// do something for doubles
}
if ( typeof( T ) == typeof( Float ) )
{
// do something different for floats..
}
}
}
Я часто нахожу не хватает C # дженериков.
Спасибо!
Павел
Решение
Весь точка генерала заключается в том, что вы можете сделать то же самое для любого допустимого типа.
Если вы действительно делаете что-то конкретное для типов, то метод больше не является универсальным и должен быть перегружен для каждого конкретного типа.
public class Vborr<T> where T : struct
{
public virtual T Next() { // Generic Implementation }
}
public class VborrInt : Vborr<int>
{
public override int Next() { // Specific to int }
}
public class VborrDouble : Vborr<double>
{
public override double Next() { // Specific to double }
}
Другие советы
Подход, который я взял сюда, было бы то, что заводской шаблон и создания специализированных экземпляров Vborr
исходя из типа. Например
public class Vborr<T> where T : struct {
protected Vborr() { }
abstract T Next();
}
public static class VborrFactory {
private sealed class VborrFloat : Vborr<float> {
public VborrFloat() {}
public override float Next() {
...
}
}
private sealed class VborrDouble : Vborr<double> {
public VborrDobule() {}
public override double Next() {
...
}
}
private sealed class VborrDefault<U> : Vborr<U> {
public VborrDefault() {}
public override U Next() {
...
}
}
public static Vborr<T> Create<T>() {
if (typeof(T) == typeof(double) ) {
return new VborrDouble();
} else if ( typeof(T) == typeof(float) ) {
return new VborrFloat();
} else {
return new VborrDefault<T>();
}
}
}
Не связан с StackOverflow