[java | coffee]脚本中继承类静态覆盖的模式?

时间:2014-03-03 22:52:51

标签: class oop design-patterns inheritance coffeescript

我正在构建一组对象来表示我的angularjs应用程序和后端API之间的数据抽象层。我正在使用coffeescript(部分原因是为了学习coffeescript,部分是因为我喜欢他们的类实现,因为我最初来自于Days of Yore的c ++和java背景)。

所以我有类似

的东西
Class Animal
@_cache: {}

...东西...

Class Dog extends Animal
@_cache: {}

等等。问题(这显然是一个语法糖的事情)是我想让Dog的所有具体子类都有自己的缓存实例。我可以通过上面的方式处理它(只是覆盖属性),或者用@_cache [@ constructor.name] = {}替换该缓存,并编写缓存访问器函数而不是直接与它交互

基本上,我要表达的模式是:“Property#{name}应该是此对象上的类级别(或静态)属性,并且所有扩展类都应该拥有自己的此属性实例”,而不是手动必须在每个孩子类型上这样做。这样做有合理的模式吗?

1 个答案:

答案 0 :(得分:2)

我有一个建议,使用实例的动态指针到它自己的类:@constructor

在此示例中,缓存在创建第一个实例时初始化,并在构造函数本身中填充。

class Animal
  # is is just here to distinguish instances
  id: null

  constructor:(@id) ->
    # @constructor aims at the current class: Animal or the relevant subclass
    # init the cache if it does not exists yet
    @constructor._cache = {} unless @constructor._cache?

    # now populates the cache with the created instance.
    @constructor._cache[@id] = @

class Dog extends Animal
   # no need to override anything. But if you wish to, don't forget to call super().

# creates some instances
bart = new Animal 1
lucy = new Dog 1
rob = new Dog 2

console.log "animals:", Animal._cache 
# prints: Object {1=Animal}
console.log "dogs:", Dog._cache
# prints: Object {1=Dog, 2=Dog}

请参阅此fiddle(控制台上的结果)