c# Ereditarietà su un parametro di tipo generico vincolato


1 Answers

Non è possibile ereditare da un parametro di tipo generico perché il tipo non è noto al momento della compilazione, quindi il compilatore non può capire quale sia la superclasse. Mi rendo conto che, a prima vista, il fatto che il compilatore possa capire cosa sia <T> sembrerebbe suggerire che dovrebbe essere in grado di capire cosa sia T, ma le due cose sono diverse.

Inoltre, hai un problema logico in Bar. Non puoi chiamare base.Bar perché questo è un tipo astratto. Per correggere questo, dovresti cambiare la tua implementazione in Foo a

public virtual void Bar() {}
c# generics

So che non è possibile ereditare da un parametro di tipo generico, ma sarebbe utile quando si implementa un proxy comune per derivate di un tipo astratto :-)

Qualcuno sa perché questo non è possibile?

Esempio C #:

abstract class Foo
{
  public virtual void Bar()
  {
     // nop
  }
}

class FooProxy<TFoo> : TFoo
  where TFoo : Foo
{

  public override void Bar()
  {
    // do some stuff before
    base.Bar();
    // do some stuff after
  }

}

EDIT: un altro codice per illustrare un esempio di come questo potrebbe essere usato. Considera i seguenti derivati ​​di Foo:

class FooX : Foo
{
  public string X { get; set; }
  public override void Bar()
  {
    Console.WriteLine("Doing Bar X");
  }
}

class FooY : Foo
{
  public string Y { get; set; }
  public override void Bar()
  {
    Console.WriteLine("Doing Bar Y");
  }
}

E il codice chiamante:

FooProxy<FooX> fooXProxy = new FooProxy<FooX>();
fooXProxy.X = "test X";
fooXProxy.Bar();

FooProxy<FooY> fooYProxy = new FooProxy<FooY>();
fooYProxy.Y = "test Y";
fooYProxy.Bar();

Il codice nel metodo FooProxy Override di Bar () verrà riutilizzato quando si utilizza FooX e FooY.

EDIT: rivisto come da Pete La risposta di OHanlon: reso il metodo Bar () virtuale.



Related


Tags

c#   generics