2015-12-11 2 views
4

Я понимаю, что это не возможно в C#, потому что Обобщения не шаблоны, и они по-разному implented (обработка во время выполнения, а не во время компиляции):Что такое эквивалент C++ Template Inheritance в C#?

public class Foo<T> : T 
{ 

} 

Вопрос, хотя и остается. Есть ли эквивалент или, возможно, альтернативный способ достичь этого?

В моем случае у меня есть три различных родительских классов Я хочу наследовать, давайте назовем их A, B, C:

public class A {} 

public class B {} 

public class C {} 

Тогда у меня есть класс Foo, а затем МНОГО более унаследовав от Foo, но каждый из них нуждается только один из A, B, C:

public class X : Foo<A> {} 

public class Y : Foo<B> {} 

public class Z : Foo<C> {} 

так класс X нуждается все функциональные возможности в Foo и все функциональные возможности в A, Y от Foo и B, и так далее ...

Как d o Я делаю это на C#?

+0

Ну нет комментариев на ответы? Я думал, что это интересная тема. –

ответ

0

Я предполагаю, что вы не можете изменять классы A, B и C (иначе вы могли бы просто наследовать их все из Foo), поэтому это моя идея: Я бы определил «Foo» как интерфейс (который я бы назвал "IFoo"):

public interface IFoo {} 

и реализовать все его методы как методы расширения:

public static class IFooExtension 
{ 
    public static void Method1(this IFoo f) { 
     // do whatever here; 
    } 
} 

, то я бы декларируют дальнейшее Classe следующим образом:

public class X : A, IFoo {} 
public class Y : B, IFoo {} 
public class Z : C, IFoo {} 

Единственная проблема (если это проблема) заключается в том, что вы можете реализовать любой метод, который вам нужен, но никаких свойств.

0

Если class X: Foo<A> { } нужна вся функциональность Foo и A, то просто не подвергать A как собственность, и вы будете иметь его:

public class Foo<T> where T : new() 
{ 
    public T Bar { get; } = new T(); 
    public void FooMethod() => Console.WriteLine("Foo method"); 
} 

public class A 
{ 
    public void AMethod() => Console.WriteLine("A method"); 
} 

public class X : Foo<A> 
{ 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var x = new X(); 
     x.FooMethod(); 
     x.Bar.AMethod(); // access via property 
    } 
} 
+0

Возможно, это то, что он уже делает (в противном случае почему общее определение?). Он все равно будет работать, это «не похоже на наследование шаблонов C++» (производный класс не будет выглядеть прямо наследуемым от нескольких родительских классов) –

Смежные вопросы