Как моделировать подклассы с разными типами одного и того же свойства в языке без обобщений? - PullRequest
1 голос
/ 06 августа 2010

У меня есть 3 типа объектов: красный, зеленый и синий. У меня есть 3 вида устройств, которые обрабатывают каждый тип объекта, соответственно. Ни одно устройство не может обрабатывать более одного типа объектов. Каждый «обработчик объекта» имеет ссылку на объект, который он обрабатывает в настоящее время.

На Java я бы сделал что-то вроде этого:

public class RedObject {}
public class GreenObject {}
public class BlueObject {}

public class AbstractHandler<T> {
   public T myObject;
}
public class RedHandler extends AbstractHandler<RedObject> {}
public class GreenHandler extends AbstractHandler<GreenObject> {}
public class BlueHandler extends AbstractHandler<BlueObject> {}

Есть ли не страшный способ сделать это на языке без дженериков? Я не хочу определять свойство myObject отдельно для каждого подкласса, поскольку тогда я теряю преимущество наследования.

(Если это поможет, я пытаюсь сделать это на actionScript 3.)

Ответы [ 3 ]

0 голосов
/ 06 августа 2010
abstract class BaseObject
{
    //has common properties for all derived classes

}
class ObjectRed : BaseObject
{
 // expended by own properties  
}
abstract class Basehandle
{
    private BaseObject _baseObject;
    //you can handle the common propertyes of base object type
    protected Basehandle(BaseObject baseObject)
    {
        _baseObject = baseObject;
    }
}
class Redhandle:Basehandle
{   // access only Objectred type
    private ObjectRed _objectRed;
    public Redhandle(ObjectRed objectRed):base(objectRed)
    {
        _objectRed = objectRed;
        //handle the extented props.
    }
}
0 голосов
/ 06 августа 2010

Если RedObject, GreenObject и BlueObject реализуют общий интерфейс, вы можете создать класс обработчика для работы с этим интерфейсом.

0 голосов
/ 06 августа 2010

Имеют общий базовый класс для красных, зеленых и синих объектов. Передайте это обработчику. Пусть каждый обработчик утверждает, что он получает правильный класс-потомок базового класса.

В Delphi:

type
  TBaseObject = class(TObject)
    ...
  end;
  TBaseObjectClass = class of TBaseObject;

  TRedObject = class(TBaseObject)
    ...
  end;

  TAbstractHandler = class(TObject)
  private
    MyObject: TBaseObject;
  protected
    class function HandlesClass: TBaseObjectClass; virtual; abstract;
  public
    constructor Create(const aObject: TBaseObject);
  end;

  TRedHandler = class(TAbstractHandler)
  protected
    function HandlesClass: TBaseObjectClass; override;
  end;

constructor TAbstractHandler.Create(const aObject: TBaseObject);
begin
  Assert(aObject.InheritsFrom(HandlesClass), 'Object does not descend from proper class');
  ...
end;

class function TRedHandler.HandlesClass: TBaseObjectClass;
begin
  Result := TRedObject;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...