шаблоны С++ и дженерики С#
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 07.09.09 10:00
Оценка: 1 (1)
Пишу сюда, т.к. интересует мнение вменяемых апологетов сразу двух языков, чья концентрация превышает норму только здесь, в ФП.

В рамках участия в небольшом мирном холиварчике на внутрикорпоративном форуме на тему сабжа, мне выкатили пример использования шаблонов С++ для реализации "псевдо-наследования" в контексте "вот как ты это на шарпе с дженериками сделаешь?", как бы намекая на то, что в шарпе нельзя унаследовать дженерик от его же параметра-типа:

#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>")

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.