Я пытаюсь написать небольшую основу для платформы 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.
Надеюсь, что очищает мой вопрос.
Если вы получили сообщение об ошибке, пожалуйста, сообщите точное сообщение об ошибке! Также вы уверены, что ваша установка выглядит так, как вы описали? Это звучит немного странно для меня, вы говорите о функции в «Entity», а затем вы переключаетесь на «_ then в Component мне нужно ссылаться на entity_», также «Entity» представляет собой смесь «IEntity» и 'IComponent', и теперь я, наконец, смущен тем, что именно вы делаете, где именно. – ndm
Да, это немного беспорядок в моем посте, я собираюсь опубликовать больше кода, когда я вернусь с работы – MyFantasy512
Я обновил свой пост, надеюсь, что теперь яснее – MyFantasy512