Re[12]: проектирование
От: neFormal Россия  
Дата: 24.07.17 10:36
Оценка:
Здравствуйте, dmz, Вы писали:

F>>алё, ты всегда можешь объявить поле/метод со значением типа предка. чтобы потом к нему обращаться и вызывать ф-ции "базовых типов".

dmz>Не очень понял — можешь код показать? Что есть предок, например. Тут есть только композиция.

я про такой Extends:
data BaseObject = BaseObject { img :: Image.Sprite } deriving (Show)

class Extends a where
  type BaseType a
  super :: a -> BaseType a

data Gun = Gun { gunBase :: BaseObject, gunDamage :: Int} deriving (Show)
instance Extends Gun where
  type BaseType Gun = BaseObject
  super = gunBase
instance SceneObject.SceneObject Gun where
  draw gun delta = do
    Image.draw (img . super $ gun) delta
    return ()
  update gun = do {print "gun update"}

data Bullet = Bullet { bulletBase :: BaseObject, bulletDamage :: Int} deriving (Show)
instance Extends Bullet where
  type BaseType Bullet = BaseObject
  super = bulletBase
instance SceneObject.SceneObject Bullet where
  draw bullet delta = do
    Image.draw (img . super $ bullet) delta
    return ()
  update bullet = do {print "bullet update"}

data Bullet2 = Bullet2 { bullet2Base :: Bullet } deriving (Show)
instance Extends Bullet2 where
  type BaseType Bullet2 = Bullet
  super = bullet2Base
instance SceneObject.SceneObject Bullet2 where
  draw bullet delta = do {print "bullet 2 render"}
  update bullet = do { print "bullet 2 update and:"; SceneObject.update $ super bullet}


dmz>Но это калька с Java-style ООП и так обычно не делают. Я бы просто сделал так,

dmz>что бы каждый тип содержал коллецию своих спрайтов, и выдергивал бы эти спрайты
dmz>с их атрибутами через syb. Включая порядок, который тоже можно задать разными
dmz>способами.

да, я понимаю. поэтому вопрос в том, как это сделать идеологически верно.

dmz>-- тоже WTF, калька с Java

dmz>-- чего б нам просто не перечислить нужные спрайты и не тащить сюда
dmz>-- OneBarrelGun, если он нам не нужен на самом деле

хочется реюзать поведение и данные. это основная мотивация.

если это можно сделать через композицию, то прекрасно. мне всё равно как организовывать данные и ф-ции, если это решает проблему.
я просто не вижу, как можно одновременно реюзать и то, и другое. только по отдельности. а по отдельности меня не устраивает.
...coding for chaos...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.