. 2 ( ) , , ( ). , , 3 ( , ).
public class A<T> // an argument to the generic method
{
}
public class B<S>
{
public virtual R Fun<T>(A<T> arg) where S : T
{
...
}
}
public class C<S> : B<S>
{
public override R Fun<T>(A<T> arg)
{
}
}
. -, ( , , , Fun ):
public interface IFun<in T>
{
R Fun<S>(B<S> self) where S : T;
R Fun<S>(C<S> self) where S : T;
}
, T , . , B C "" :
public class B<S>
{
public virtual R Perform(IFun<S> fun)
{
return fun.Fun(this);
}
}
public class C<S> : B<S>
{
public override R Perform(IFun<S> fun)
{
return fun.Fun(this);
}
}
A<T>, struct/class, :
public struct TheFun<T> : IFun<T>
{
public A<T> arg;
R IFun<T>.Fun<S>(B<S> self)
{
... body of B<S>.Fun(A<T> arg) ...
}
R IFun<T>.Fun<S>(C<S> self)
{
... body of C<S>.Fun(A<T> arg) ...
}
}
, , , 2:
public static class Extensions
{
public static R Fun<S,T>(this B<S> self, A<T> arg) where S : T
{
return self.Perform(new TheFun<T> { arg = arg });
}
}
. . :