Design patterns 在没有泛型的语言中,如何对具有相同属性的不同类型的子类进行建模?

Design patterns 在没有泛型的语言中,如何对具有相同属性的不同类型的子类进行建模?,design-patterns,generics,oop,Design Patterns,Generics,Oop,我有三种类型的对象:红色、绿色和蓝色。我有3种设备分别处理每种类型的对象。任何设备都不能处理超过1种类型的对象。每个“对象处理程序”都有一个对当前正在处理的对象的引用 在Java中,我会这样做: public class RedObject {} public class GreenObject {} public class BlueObject {} public class AbstractHandler<T> { public T myObject; } public

我有三种类型的对象:红色、绿色和蓝色。我有3种设备分别处理每种类型的对象。任何设备都不能处理超过1种类型的对象。每个“对象处理程序”都有一个对当前正在处理的对象的引用

在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> {}
公共类重做对象{}
公共类GreenObject{}
公共类BlueObject{}
公共类抽象处理程序{
公共T对象;
}
公共类RedHandler扩展了AbstractHandler{}
公共类GreenHandler扩展了AbstractHandler{}
公共类BlueHandler扩展了AbstractHandler{}
在没有泛型的语言中,有没有什么非恐怖的方法可以做到这一点?我不想在每个子类上分别定义
myObject
属性,因为这样我就失去了继承的优势


(如果有帮助,我尝试使用的语言是actionscript 3。)

为红色、绿色和蓝色对象提供一个公共基类。将其传递给处理程序。让每个处理程序断言它正在接收基类的正确子类

在德尔福:

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;

如果RedObject、GreenObject和BlueObject都实现了一个公共接口,那么可以构建处理程序类来处理该接口

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.
    }
}