这是我的问题的一个非常简化的版本,但应该足以解决我的问题。
我们假设我有DressingRoom,Person,Hat,Badge和Foreman等课程,该应用程序允许您在更衣室里给一个人不同类型的帽子,如果它是一个领班,他可以得到一个徽章也是。 我想要的是,如果你给他一顶白帽子并让他只是一个普通人,如果不是,那么他就会成为一名工头。
是否可以在Person中将某个类设置为其自身的子类,而不是必须在Dressing Room类中进行(这很容易)。
public class DressingRoom{
public var length:int;
public var occupant:Person;
}
public class Person{
public var name:String;
public var hat:Hat;
public function hatChanged():void{
if (hat.color==0xFFFFFF){
this = new Foreman(name,hat);
}
}
}
public class Hat{
public var size:int;
public var color:uint;
}
public class Foreman() extends Person{
public var badge:Badge;
public function hatChanged():void{
if (hat.color!=0xFFFFFF){
this = new Person(name,hat);
}
}
}
答案 0 :(得分:1)
你问题的直接答案是否定的。你在更衣室的概念中走在正确的轨道上虽然你占据了占用者:包装类中的人,并在需要时检查它是否属于Foreman类型。
答案 1 :(得分:1)
似乎是装饰设计模式的一个很好的候选者。在as3dp.com
上有相当多的内容答案 2 :(得分:1)
奇怪的问题:)您可以使用合成而不是继承。它看起来像这样:
public interface IHat{
function get status():HatStatus
}
public class ForemanHat implements IHat{
private const status:ForemanStatus = new ForemanStatus();
public function get status():HatStatus {return status;}
}
public class Person{
private var status:HatStatus;
public function setHat(hat:IHat):void{
status = hat.status;
}
public function get status():HatStatus{ return status}
}
你可以简单地添加更多帽子。