Здравствуйте, 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, если он нам не нужен на самом деле
хочется
реюзать поведение и данные. это основная мотивация.
если это можно сделать через композицию, то прекрасно. мне всё равно как организовывать данные и ф-ции, если это решает проблему.
я просто не вижу, как можно одновременно реюзать и то, и другое. только по отдельности. а по отдельности меня не устраивает.