2013-09-02 2 views
0

Я пытаюсь написать небольшую основу для платформы Entity-Component. Я просто столкнулся с логической проблемой с моей базой.Можно ли ссылаться на абстрактный класс в интерфейсе?

Дело в том, что у меня есть две вещи: сущности (которые могут содержать другие объекты и компонент) и компоненты (они привязаны к определенному объекту).

Так что я сделал два интерфейса:

interface IEntity 
interface IComponent 

И я сделал абстрактные классы для каждого

public class Component implements IComponent 
public class Entity extends Sprite implements IEntity, IComponent 

Проблема в том, что в интерфейсе IEntity У меня есть функция:

function addComponent(e:Entity) 

Причина, по которой тип аргумента i Entity, потому что тогда в компоненте мне нужно ссылаться на функции сущности что он наследует от Sprite (я не могу сделать это с типом IEntity).

Но, похоже, Flash Develop рассматривает его как ошибку (реализация этой функции в классе Entity). Я делаю что-то неправильно?

EDIT:

Это те интерфейсы:

public interface IComponent 
{ 
    function get parentGameObject() : IEntity; 
    function set parentGameObject(v:IEntity) : void; 
    function init() : void; 
    function dispose() : void; 
} 

public interface IEntity 
{ 
    function addComponent(c:IComponent) : IComponent; 
    function removeComponent(c:IComponent) : Boolean; 
    function getComponent(type:Class) : IComponent; 
    function hasComponentOfType(type:Class) : Boolean; 
    function addGameObject(child:Entity) : void; 
} 

Тогда мой абстрактный класс Entity реализует оба этих интерфейсов + простирается от DisplayObjectContainer, потому что каждая компания должна функциональность рендеринга себя и своего ребенка Сущности.

Проблема заключается в том, что:

public function addGameObject(e:Entity) : void { 
    m_components.push(v); 

    this.addChild(v); 
    v.gameObject = this; 
    v.init(); 
} 

кажется недействительным, и ошибка: Метод интерфейс addGameObject в интерфейсе IEntity осуществляется с incompatibile подписью в классе Entity.

И причина, по которой я хочу использовать e: Entity, а не e: IEntity - это потому, что я использую this.addChild (v), который принадлежит DisplayObjectContainer.

Надеюсь, что очищает мой вопрос.

+1

Если вы получили сообщение об ошибке, пожалуйста, сообщите точное сообщение об ошибке! Также вы уверены, что ваша установка выглядит так, как вы описали? Это звучит немного странно для меня, вы говорите о функции в «Entity», а затем вы переключаетесь на «_ then в Component мне нужно ссылаться на entity_», также «Entity» представляет собой смесь «IEntity» и 'IComponent', и теперь я, наконец, смущен тем, что именно вы делаете, где именно. – ndm

+0

Да, это немного беспорядок в моем посте, я собираюсь опубликовать больше кода, когда я вернусь с работы – MyFantasy512

+0

Я обновил свой пост, надеюсь, что теперь яснее – MyFantasy512

ответ

0

Я до сих пор не могу понять, почему эта ошибка возникает, реализация addGameObject выглядит нормально до сих пор (я полагаю, что использование v - проблема, которая существует только в примере кода?), Хотя имя параметра отличается от определение интерфейса, где оно находится child, а не e, однако AFAIK это действительно в AS3, тем не менее, попробуйте использовать имя, определенное в интерфейсе.

И в отношении фактического вопроса, конечно, ответ зависит. Как правило, вы можете ссылаться на любые классы, которые вам нравятся в интерфейсе, единственной проблемой здесь должны быть шаблоны проектирования.

Если вы хотите, чтобы продолжить программирование против интерфейсов, то вы можете просто создать объект интерфейс игры, что заставляет реализовать метод addChild, что-то вроде этого:

import flash.display.DisplayObject; 

public interface IGameObject extends IComponent, IEntity 
{ 
    function addChild(child:DisplayObject):DisplayObject; 
} 

Изменить свой интерфейс IEntity, ваш addGameObject и Entity осуществление соответственно, и вы должны быть хорошо идти:

public interface IEntity 
{ 
    ... 
    function addGameObject(child:IGameObject) : void; 
} 
public function addGameObject(child:IGameObject) : void { 
    ... 
} 
public class Entity extends Sprite implements IGameObject 

Хотя вы можете переименовать Entity что-то вроде GameObject для того, чтобы избежать путаницы.

+0

Я также подумали о добавлении addChild к интерфейсу, но я не знал, что ваш интерфейс может расширить другие интерфейсы (и это аккуратно). Благодарим за ответ в любом случае, идем с этим после работы. – MyFantasy512

0

Вот как я решил эту проблему прямо сейчас:

Три основных интерфейсов для каждой функциональности, геймобжектов:

public interface IComponent 
{ 
    function get gameObject() : IGameObject; 
    function set gameObject(v:IGameObject) : void; 
    function init() : void; 
    function dispose() : void; 
} 

public interface IDisplayObjectContainer 
{ 
    function get displayContainer() : DisplayObjectContainer; 
} 

public interface IEntity 
{ 
    function addComponent(c:IComponent) : IComponent; 
    function removeComponent(c:IComponent) : Boolean; 
    function getComponent(type:Class) : IComponent; 
    function hasComponentOfType(type:Class) : Boolean;  
} 

И мое соединение интерфейса геймобжектов на данный момент расширяет все эту функциональность,:

public interface IGameObject extends IEntity, IComponent, IDisplayObjectContainer 
{ 
     function addGameObject(g:IGameObject) : void; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^