Вопрос по полиморфизму.
|
|
Техник | Дата: Пятница, 15 Июля 2011, 20:38 | Сообщение # 1 |
Глава X-ray Games
Сейчас нет на сайте
| При написании движка возникла такая проблема. Так как использую два API :Directx 9 и Directx 10, то приходится работать с различающейся архитектурой классов. Из-за этого возникают проблемы. есть класс Code class DefaultDriver { ... };
class D3D9Driver:public DefaultDriver { ... public: IDirect3DDevice9* GetDevice(); //получить указатель на устройство };
class D3D10Driver:public DefaultDriver { ... public: ID3D10Device* GetDevice(); //получить указатель на устройство }; Все функции работают через вызовы базового класса, но как реализовать метод GetDevice в базовом,чтобы подходил для обоих классов?
|
|
| |
Kamskii | Дата: Пятница, 15 Июля 2011, 20:58 | Сообщение # 2 |
Game ≠ Toy
Сейчас нет на сайте
| Техник, может объявить его в базовом как виртуальный и перегрузить в каждом из классов-наследников?
|
|
| |
Техник | Дата: Суббота, 16 Июля 2011, 11:36 | Сообщение # 3 |
Глава X-ray Games
Сейчас нет на сайте
| В том то и дело как это сделать в производных классах у этой функции разные типы возвращаемого значения.
|
|
| |
getName | Дата: Суббота, 16 Июля 2011, 11:50 | Сообщение # 4 |
JAVA. Написано однажды, работает везде.
Сейчас нет на сайте
| Var?
Пришельцы! 2012 (рассказ)
|
|
| |
Kornival | Дата: Суббота, 16 Июля 2011, 12:00 | Сообщение # 5 |
The Witcher
Сейчас нет на сайте
| И?
|
|
| |
noTformaT | Дата: Суббота, 16 Июля 2011, 12:28 | Сообщение # 6 |
Ukrainian independent game developer
Сейчас нет на сайте
| Kornival, по идеи getName имел в виду не определенный тип VAR. Но в с++ его нет, а в шарпе есть Quote (Техник) Так как использую два API :Directx 9 и Directx 10, вот тут не понял, разве в Д10 нет того что есть в Д9? Quote (Kamskii) Все функции работают через вызовы базового класса, но как реализовать метод GetDevice в базовом,чтобы подходил для обоих классов? делаем его виртуальным и перегружаем его в потомках. тоесть в базовом классе метод нечего не возвращает, а потомке "а" возвращает тип "аа", а в потомке "б" - тип "бб"
@noTformaT
|
|
| |
Kornival | Дата: Суббота, 16 Июля 2011, 12:35 | Сообщение # 7 |
The Witcher
Сейчас нет на сайте
| Quote (noTformaT) делаем его виртуальным и перегружаем его в потомках. тоесть в базовом классе метод нечего не возвращает, а потомке "а" возвращает тип "аа", а в потомке "б" - тип "бб" Не прокатит Хотя надо проверить.
|
|
| |
noTformaT | Дата: Суббота, 16 Июля 2011, 12:40 | Сообщение # 8 |
Ukrainian independent game developer
Сейчас нет на сайте
| есть еще метод, но возможно он не проканает, если с++ не поддерживает множественное наследие. объявить класс "а", который наследует два класса, класс с Д9, и класс с Д10.
@noTformaT
|
|
| |
Kornival | Дата: Суббота, 16 Июля 2011, 12:43 | Сообщение # 9 |
The Witcher
Сейчас нет на сайте
| Для того чтобы определить какая именно функция вызывается компилятору не достаточно одого только типа возвращаемого значения. А вот если в перегружаемые функции передавать разные параметры, тогда пожалуйста. ТС надо или передавать в эти функции какие-то параметры, или подумать над более удачной архитектурой движка.Добавлено (16.07.2011, 12:43) ---------------------------------------------
Quote (noTformaT) есть еще метод, но возможно он не проканает, если с++ не поддерживает множественное наследие. объявить класс "а", который наследует два класса, класс с Д9, и класс с Д10. С++ поддерживает множественное наследование, но все-равно:Quote (Kornival) Для того чтобы определить какая именно функция вызывается компилятору не достаточно одого только типа возвращаемого значения. А вот если в перегружаемые функции передавать разные параметры, тогда пожалуйста.
|
|
| |
zodiak | Дата: Суббота, 16 Июля 2011, 12:55 | Сообщение # 10 |
постоянный участник
Сейчас нет на сайте
| Quote (Техник) В том то и дело как это сделать в производных классах у этой функции разные типы возвращаемого значения. Они то разные, но они указатели, а конвертация указателей плевое дело. Вот только позже тебе придется проверять какой дх активен и приводить к нужному. Да и проще иметь не два разных класса для разных дх, а один, содержащий оба дх и подстраивающийся под ситуацию. Но это подстраивание под ситуацию будет стоить чуть, чуть производительности. Так что лучше сделать два набора абсолютно идентичных класов, являющихся унифицированной оберткой для разный дх апи, и использовать нужный набор.
Точка зору окремо взятого індивіда завжди суб'єктивна!
Взломщик Battle City.Net
|
|
| |
Техник | Дата: Воскресенье, 17 Июля 2011, 15:25 | Сообщение # 11 |
Глава X-ray Games
Сейчас нет на сайте
| Если сделать общий класс-обертку,то это дорогого стоить будет, так как в десятке многое отличается от работы в девятой версии. Добавлено (17.07.2011, 15:25) --------------------------------------------- Решил проблему, посмотрев как реализовали этот метод в других движках(Irrlicht,OGRE). Всем спасибо за помощь.
Сообщение отредактировал Техник - Суббота, 16 Июля 2011, 13:54 |
|
| |