Есть ли технология дифференцированного класса поведения на общих типах?

StackOverflow https://stackoverflow.com/questions/3943701

  •  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>();
    }
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top