2

質問

(任意の継承の深さレベルの) 子のコンストラクター名を取得するにはどうすればよいでしょうか?

説明

Catクラスを拡張するクラスを用意しましょうModel。そしてクラスKittenを拡張するCatクラス。

私が望む"Kitten"ものは、クラスインスタンスを作成するときにコンソール(たとえば)文字列に出力され、Kittenクラスインスタンスを作成"Cat"するときに文字列に出力されCatます。

トリックは、コンストラクター名を出力するコードがベース (Model示されている例の場合) クラスに配置されている必要があることです。

注:私は (自分の範囲内で) Javascript と比較して、Ruby が得意です。したがって、「疑似コード」はRubyっぽいものになります=)

# pseudo-Ruby-code
class Model
  def initialize
    console.log(self.constructor.toString())
  end
end

class Cat << Model
  # something goes here
end

class Kitten << Cat
  # and here too
end

# shows "Model"
Model.new

# shows "Kitten"
Kitten.new

# shows "Cat"
Cat.new
4

1 に答える 1

1

これは、Coffee-Script を使用して行う方法です。

class Model

    constructor: (animal = "Model") ->

        console.log animal;



class Cat extends Model

    constructor: (animal = "Cat") ->

        super animal


class Kitten extends Cat

    constructor: (animal = "Kitten") ->

        super animal

new Kitten()

// => Kitten

これはコンパイルされた JavaScript です。

var Cat, Kitten, Model,
  __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

Model = (function() {

  function Model(animal) {
    if (animal == null) {
      animal = "Model";
    }
    console.log(animal);
  }

  return Model;

})();

Cat = (function(_super) {

  __extends(Cat, _super);

  function Cat(animal) {
    if (animal == null) {
      animal = "Cat";
    }
    Cat.__super__.constructor.call(this, animal);
  }

  return Cat;

})(Model);

Kitten = (function(_super) {

  __extends(Kitten, _super);

  function Kitten(animal) {
    if (animal == null) {
      animal = "Kitten";
    }
    Kitten.__super__.constructor.call(this, animal);
  }

  return Kitten;

})(Cat);

new Kitten();

ここで自分で試すことができます

于 2013-01-23T16:26:21.323 に答える