Homework Quality Code и абстрактни класове(интерфейси) в C++
Здравейте, колеги!
Тъй като лектора така и не обясни как се правят и използват абстрактни класове в C++, след ровене по нета и на база знания по C# сътворих следният код
Направила съм абстрактни класове, които екстендвам с конкретна имплементация, а на методите, които ги ползват подавам абстрактните класове, нещо като dependency injection. Моля, за коментар или ако някой има по-добра идея да сподели.
Ако някой знае как се правят папки и как се организират файловете в тях в C++ проект във VisualStudio, пак да сподели :)
Направих абстрактни класове, защото в C++ това са интерфейси и при евентуaлно следващо наследяване или друга имплементация на тези класове, с цел extend-ване на кода. Но най-вече за да пробвам дали ще ми позволи dependecny injection с абстрактни класове, чиито методи са pure virtual (=0) и сработи. Нали лекцията беше за КПК. Обаче съвсем не знам дали така се прави и тъй като лектора само разказа, а не показа реших да се поровя. Надявам се да видя и други примери на колегите. Благодаря за коментара!
И аз да добавя една идея. DI доколкото знам се прави по 3 начина - през конструктор, поле или сетер, въпреки че не е задължително. Но тук изглежда че се повтаряш, като подаваш едни и същи типове всеки път. Иначе точно така се прави интерфейс (в смисъла на ц#). Но пък това са много различни езици. Аз се опитвам да гледам по-практично на нещата, не задължително да правя винаги "голи" интерфейси ;) Ако се предполага че един метод ще работи в 90% от случаите, го имплементирам още в базовия клас. Ако мога го правя не-виртуален. Хубаво е да се има предвид, че виртуалните методи бавят допълнително по време на изпълнение. Иначе всички методи щяха да бъдат виртуални :)
Благодаря за коментара. Това, което казваш се надявах лектора да го обясни. Как се прави injection? Всеки знае, че DI e част от SOLID, как става и кога се прави в C++. Освен това не знаех. че виртуалните методи бавят performance-a. Надявах се и на примери :)
Да, виртуалните методи бавят, защото кой точно метод по йерархията ще се извика се определя на базата на една таблица (vtable) по-време-на-изпълниение. Твоят метод дефинира атрибут от тип "адрес към GameUnit", но на този адрес по време на изпълнение може да има GameUnitExtended, който също "е" GameUnit. Предпочитания виртуален метод тогава ще е на GameUnitExtended.
Иначе кой "нормален" (не-виртуален) метод ще се извика е ясно при компилирането - на GameUnit.