Loading...
yuletodim avatar yuletodim 37 Точки

Homework Quality Code и абстрактни класове(интерфейси) в C++

Здравейте, колеги!

Тъй като лектора така и не обясни как се правят и използват абстрактни класове в C++, след ровене по нета и на база знания по C# сътворих следният код

Направила съм абстрактни класове, които екстендвам с конкретна имплементация, а на методите, които ги ползват подавам абстрактните класове, нещо като dependency injection. Моля, за коментар или ако някой има по-добра идея да сподели.

Ако някой знае как се правят папки и как се организират файловете в тях в C++ проект във VisualStudio, пак да сподели :)

1
C++ Programming
psykepro avatar psykepro 18 Точки

Така наистина си използвал абстрактни класове, но не е ли грешно понеже няма никакво преизползване от предишния клас.Смисъл аз като гледам ти трябва във конкретния да имплементираш абсолютно всичко наново.

0
06/07/2016 18:38:23
yuletodim avatar yuletodim 37 Точки

Направих абстрактни класове, защото в C++ това са интерфейси и при евентуaлно следващо наследяване или друга имплементация на тези класове, с цел extend-ване на кода. Но най-вече за да пробвам дали ще ми позволи dependecny injection с абстрактни класове, чиито методи са pure virtual (=0) и сработи. Нали лекцията беше за КПК. Обаче съвсем не знам дали така се прави и тъй като лектора само разказа, а не показа реших да се поровя. Надявам се да видя и други примери на колегите. Благодаря за коментара!

1
asparuh.k avatar asparuh.k 16 Точки

И аз да добавя една идея. DI доколкото знам се прави по 3 начина - през конструктор, поле или сетер, въпреки че не е задължително. Но тук изглежда че се повтаряш, като подаваш едни и същи типове всеки път. Иначе точно така се прави интерфейс (в смисъла на ц#). Но пък това са много различни езици. Аз се опитвам да гледам по-практично на нещата, не задължително да правя винаги "голи" интерфейси ;) Ако се предполага че един метод ще работи в 90% от случаите, го имплементирам още в базовия клас. Ако мога го правя не-виртуален. Хубаво е да се има предвид, че виртуалните методи бавят допълнително по време на изпълнение. Иначе всички методи щяха да бъдат виртуални :)

0
yuletodim avatar yuletodim 37 Точки

Благодаря за коментара. Това, което казваш се надявах лектора да го обясни. Как се прави injection? Всеки знае, че DI e част от SOLID, как става и кога се прави в C++. Освен това не знаех. че виртуалните методи бавят performance-a. Надявах се и на примери :)

0
asparuh.k avatar asparuh.k 16 Точки

Да, виртуалните методи бавят, защото кой точно метод по йерархията ще се извика се определя на базата на една таблица (vtable) по-време-на-изпълниение. Твоят метод дефинира атрибут от тип "адрес към GameUnit", но на този адрес по време на изпълнение може да има GameUnitExtended, който също "е" GameUnit. Предпочитания виртуален метод тогава ще е на GameUnitExtended.

Иначе кой "нормален" (не-виртуален) метод ще се извика е ясно при компилирането - на GameUnit.

 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.