List со ссылками на объекты разных классов

  1. 3 г. назад

    Всем привет.
    Нубский вопрос, наверное :)
    Допустим, у меня есть два класса Alien и Human. Объекты каждого класса имею методы рендера себя. Я хочу создать глобальный список объектов для рендера, чтобы его сортировать и т.п. Как лучше такое организовать? Запихивать в список объекты разного класса вроде бы нельзя. Можно конечно создать промежуточный класс для списка и в нем хранить возможные типы объектов и по ним отсылать к нужному методу нужного класса. Но нет ли способа лучше?

  2. devolonter

    11 Jul 2014 Администратор
    3 г. назад исправил devolonter

    Привет! Как насчет интерфейсов? Мне кажется для твоей задачи идеально подходит:

    Import mojo
    
    Interface Drawable
    	
    	Method Render:Void()
    
    End Interface
    
    Class Human Implements Drawable
    	
    	Method Render:Void()
    		DrawRect(10, 10, 100, 100)
    	End Method
    
    End Class
    
    Class Alien Implements Drawable
    	
    	Method Render:Void()
    		DrawCircle(150, 150, 50)
    	End Method
    
    End Class
    
    Class Game Extends App
    
    	Field drawables:List<Drawable>
    
    	Method OnCreate()
    		SetUpdateRate(60)
    		drawables = New List<Drawable>()
    		
    		drawables.AddLast(New Human())
    		drawables.AddLast(New Alien())
    	End
    	
    	Method OnRender()
    		Cls()
    		For Local drawable:Drawable = EachIn drawables
    			drawable.Render()
    		Next
    	End
    
    End
    
    Function Main()
    	New Game()
    End
  3. 3 г. назад исправил trion

    Офигенно :) Спасибо!!!

  4. Я бы сделал так(код ниже), тем более классы Alien и Human явно будут очень похожи и наверняка будут иметь одинаковые методы, поэтому очень логично унаследовать их от общего класса, в котором эти методы и будут реализованы.

    Import mojo
    
    Class Humanoid
    	Global list:List<Humanoid> = New List<Humanoid>()
    	
    	Method New()
    		Humanoid.list.AddLast(Self)
    	End Method
    	
    	Method Render:Void()
    		
    	End Method
    	
    	Function RenderAll:Void()
    		For Local h:Humanoid = EachIn Humanoid.list
    			h.Render()
    		Next
    	End Function
    	
    End Class
    
    Class Human Extends Humanoid
    	
    	Method Render:Void()
    		DrawRect(10, 10, 100, 100)
    	End Method
    
    End Class
    
    Class Alien Extends Humanoid
    	
    	Method Render:Void()
    		DrawCircle(150, 150, 50)
    	End Method
    
    End Class
    
    Class Game Extends App
    
    	Method OnCreate()
    		SetUpdateRate(60)
    
    		New Human()
    		New Alien()
    	End
    	
    	Method OnRender()
    		Cls()
    		Humanoid.RenderAll()
    	End
    
    End
    
    Function Main()
    	New Game()
    End
  5. devolonter

    13 Jul 2014 Администратор

    @werton тоже вариант! Только иногда бывает, что "вдруг" появляется класс Asteroid, который ни туда ни сюда - это тоже стоит учитывать.

или зарегистрируйтесь чтобы комментировать!