Dla tego, co jest warte, oto przykład, w jaki sposób dziedziczenie po klasie ogólnej jest używane w kompilatorze Roslyn Microsoftu, nawet bez zmiany nazwy klasy. (Byłem tak oszołomiony, że znalazłem się tutaj, szukając, czy to naprawdę możliwe).
W projekcie CodeAnalysis można znaleźć tę definicję:
/// <summary>
/// Common base class for C# and VB PE module builder.
/// </summary>
internal abstract class PEModuleBuilder<TCompilation, TSourceModuleSymbol, TAssemblySymbol, TTypeSymbol, TNamedTypeSymbol, TMethodSymbol, TSyntaxNode, TEmbeddedTypesManager, TModuleCompilationState> : CommonPEModuleBuilder, ITokenDeferral
where TCompilation : Compilation
where TSourceModuleSymbol : class, IModuleSymbol
where TAssemblySymbol : class, IAssemblySymbol
where TTypeSymbol : class
where TNamedTypeSymbol : class, TTypeSymbol, Cci.INamespaceTypeDefinition
where TMethodSymbol : class, Cci.IMethodDefinition
where TSyntaxNode : SyntaxNode
where TEmbeddedTypesManager : CommonEmbeddedTypesManager
where TModuleCompilationState : ModuleCompilationState<TNamedTypeSymbol, TMethodSymbol>
{
...
}
Następnie w projekcie CSharpCodeanalysis istnieje następująca definicja:
internal abstract class PEModuleBuilder : PEModuleBuilder<CSharpCompilation, SourceModuleSymbol, AssemblySymbol, TypeSymbol, NamedTypeSymbol, MethodSymbol, SyntaxNode, NoPia.EmbeddedTypesManager, ModuleCompilationState>
{
...
}
Ta nietypowa klasa PEModuleBuilder jest szeroko stosowana w projekcie CSharpCodeanalysis, a kilka klas w tym projekcie dziedziczy po niej, bezpośrednio lub pośrednio.
A następnie w projekcie BasicCodeanalysis jest następująca definicja:
Partial Friend MustInherit Class PEModuleBuilder
Inherits PEModuleBuilder(Of VisualBasicCompilation, SourceModuleSymbol, AssemblySymbol, TypeSymbol, NamedTypeSymbol, MethodSymbol, SyntaxNode, NoPia.EmbeddedTypesManager, ModuleCompilationState)
Ponieważ możemy (mam nadzieję) założyć, że Roslyn został napisany przez ludzi z rozległą wiedzą na temat języka C # i tego, jak należy go używać, myślę, że jest to zalecenie tej techniki.