Пишу сюда, т.к. интересует мнение вменяемых апологетов сразу двух языков, чья концентрация превышает норму только здесь, в ФП.
В рамках участия в небольшом мирном холиварчике на внутрикорпоративном форуме на тему сабжа, мне выкатили пример использования шаблонов С++ для реализации "псевдо-наследования" в контексте "вот как ты это на шарпе с дженериками сделаешь?", как бы намекая на то, что в шарпе нельзя унаследовать дженерик от его же параметра-типа:
#include<iostream>
using namespace std;
template < class T >
class Test : public T
{
public:
void Test1()
{
cout<<"Test1"<<endl;
};
};
class Papa
{
public:
void Papa1()
{
cout<<"Papa1"<<endl;
};
};
class Mama
{
public:
void Mama1()
{
cout<<"Mama1"<<endl;
};
};
void main()
{
Test<Papa> testPapa;
testPapa.Papa1();
testPapa.Test1();
Test<Mama> testMama;
testMama.Mama1();
testMama.Test1();
}
в результате ковыряний в студии, я эмперически пришел вот к такому коду:
using System;
namespace Generics1
{
class Test<T> where T : Test<T>, new()
{
public void Test1() {
Console.WriteLine("Test1");
}
public T getInstance() {
return new T();
}
}
class Papa : Test<Papa>
{
public Papa() { }
public void Papa1() {
Console.WriteLine("Papa1");
}
}
class Mama : Test<Mama>
{
public Mama() { }
public void Mama1() {
Console.WriteLine("Mama1");
}
}
class Program
{
static void Main(string[] args) {
var testPapa = new Test<Papa>().getInstance();
testPapa.Test1();
testPapa.Papa1();
var testMama = new Test<Mama>().getInstance();
testMama.Test1();
testMama.Mama1();
Console.ReadKey();
}
}
}
Собственно вопрос к местным гуру плюсов и шарпа : действительно ли приведенный шарповый код аналогичен плюсовому? Если нет, то в чем разница (кроме compile-time/runtime)?
И вопрос со звездочкой (я не знаю ответ): почему этот код вообще компилируется и тем более выполняется? (смущает, в основном, "class Test<T> where T : Test<T>")