1

这是我的问题的一个非常简化的版本,但应该足以让我解决我的问题。

假设我有 DressingRoom、Person、Hat、Badge 和 Foreman 等课程,并且该应用程序允许您在一个人在更衣室时给他们不同类型的帽子,如果是工头,他也可以获得徽章. 我希望用户成为工头,如果你给他一顶白帽子,如果不是,让他成为一个普通人。

是否可以在 Person 中将某个类设置为其自身的子类,而不必在更衣室类中进行(这很容易做到)。

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);
    }
  }
} 
4

3 回答 3

1

Strange question :) You can use composition instead of inheritance. It could looks like this:

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

You can add more hats simply.

于 2012-08-17T20:06:13.140 回答
1

似乎是装饰器设计模式的一个很好的候选者。在as3dp.com上有很多内容

于 2012-08-17T19:22:23.827 回答
1

您的问题的直接答案是否定的。尽管您将 occupant:Person 放在包装类中,但您在更衣室概念方面处于正确轨道,并在需要时检查它是否为 Foreman 类型。

于 2012-08-17T18:20:25.640 回答