2017-02-28 11 views
1

親メソッドは、子メソッドの内部で使用されているかどうかをチェックし、私は子供のクラスはまだそれを呼ばせずに親メソッドを使用している場合に伝える方法がありますかどうかを知りたいと思いました。理想的には、子のメソッドのいずれかがメソッドの定義で親のメソッドを使用しているかどうかを確認するために、親のコンストラクタでチェックを実行したいと思います。Javascriptを - 私は親クラスを拡張し、いくつかのJSを書いて

私は研究のビットをやったとObject.getOwnPropertyNames()のようなものに遭遇してきたが、私は私は正しい方向に向かってるかはわかりません。例えば

class Path { 

    constructor (name) { 
     // how can I check if addRelationship have been used? If possible. 
     this.relationships   = {}; 
     this.currentRelationship = ''; 
     this.path     = path; 
    } 

    addRelationship (relationship) { 
     // do something 
     this.currentRelationship = relationship.path; 

     return this; 
    } 

    makePath() { 
     let path = [this.path]; 

     if(this.currentRelationship) { 
      path.push(this.currentRelationship) 
     } 

     return path.join("/"); 
    } 

} 

class OnePath extends Path { 
    // ... 
    someMethodFromThatRelationship() { } 
} 

class TwoPath extends Path { 
    // ... 
} 

var onePath = new OnePath('one'); 
var twoPath = new TwoPath('two-path'); 

class SomeOtherPath extends Path { 

    one() { 
     return this.addRelationship(onePath); 
    } 

    two() { 
     return this.addRelationship(twoPath); 
    } 

} 

上記の例のアイデアは、私がaddRelationshipは、いずれの方法で参照されているかどうかをチェックし、もしそうなら、one()two()が実際に呼び出される前にthis.relationships.onethis.relationships.twoを登録することができています。私は意味があると思う。私はこれが可能かどうかを知りたい。

let someOtherPath = new SomeOtherPath('some-other-path'); 

// now I can call 
someOtherPath.relationships.one.someMethodFromThatRelationship(); 

// and can also call the save method from the extended class 
someOtherPath.one().makePath(); 
// some-other-path/one 

// I can also just call 
someOtherPath.makePath(); 
// some-other-path 
+1

は、インターフェイスを作成しようとしていますか? –

+0

@KeithHolliday Utlimately、はい。あるいは少なくとも何らかの形のインターフェース。 –

+1

[実際の問題](http://meta.stackexchange.com/q/66377)とは何ですか?子クラスのメソッドの名前を取得するか、実際には 'addRelationship'を呼び出すメソッドだけを取得するだけですか? – Bergi

答えて

2

子クラスが親を使用している場合伝える方法があります:

上記のコードの最終結果は、次の操作を実行する能力だろう更新

方法はまだそれを呼び出すことなく?

いいえプログラムを呼び出すことなくどのプログラムを実行するかは、解決不可能なhalting problemに相当します。

1

私は、あなたが実際に探していることは一度関係とそれに付随するメソッドを作成するための、より宣言的なアプローチだと思います。あまりにも多くのマジック(親クラスのコンストラクタがその子クラスコードを検査することは確かにありますが)を使用せず、明示的に使用してください。

class Path { 
    constructor (path) { 
     this.relationships   = {}; 
     this.currentRelationship = ''; 
     this.path     = path; 
    } 
    addRelationship (name, relationship) { 
     this.relationships[name] = relationship; 
     this[name] = function() { 
      // do something 
      this.currentRelationship = name; 
      return this.relationships[name]; 
     } 
     return this; 
    } 

    makePath() { 
     let path = this.path; 
     if (this.currentRelationship) { 
      path += "/" + this.relationships[this.currentRelationship].makePath(); 
     } 
     return path; 
    } 
} 

class SomeOtherPath extends Path { 
    constructor(name) { 
     super(name); 
     this.addRelationship("one", new OnePath('one')); 
     this.addRelationship("two", new TwoPath('two-path')); 
    } 
} 

あるいは

class Path { 
    constructor (path, relationships = {}) { 
     this.relationships   = relationships; 
     this.currentRelationship = ''; 
     this.path     = path; 

     for (let const r in relationships) 
      this.addRelationship(r, relationships[r]); 
    } 
    … 
} 

class SomeOtherPath extends Path { 
    constructor(name) { 
     super(name, { 
      one: new OnePath('one'), 
      two: new TwoPath('two-path') 
     }); 
    } 
} 

彼らは他の方法を持っていないかだけ(シングルトンとして)一度インスタンス化されている場合は多分あなたも、それ以上のこれらの子クラスは必要ありません。あなたはもちろん、静的クラスに宣言を置くことができることをしたくない場合は、上記のアプローチは、コンストラクタのすべてのインスタンス化に新しい方法と新しいサブパスを作成します

注意してください。ただ、addRelationShipデフォルトrelationshipsオブジェクトを初期化し、クラスの.prototypeのメソッドを置く静的メソッドを作ります。パターンのバリエーションは無限です。

クラスについて提案されているdecorators featureを試してみることもできます。

関連する問題