Design patterns 在没有泛型的语言中,如何对具有相同属性的不同类型的子类进行建模?
我有三种类型的对象:红色、绿色和蓝色。我有3种设备分别处理每种类型的对象。任何设备都不能处理超过1种类型的对象。每个“对象处理程序”都有一个对当前正在处理的对象的引用 在Java中,我会这样做: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
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.
}
}