2011-01-19 16 views
2

私はこの質問と同様の詳細を持つシステムを構築しています:Can I have different copies of a static variable for each different type of inheriting classプライベートAND静的AND継承された変数!?または同様のもの

JavaScriptを除いて!

私は一連のサブクラスを用意します。各サブクラスには、プログラムの生存期間中に作成された多数のインスタンスがあります。特定のサブクラスの各インスタンスは、すべてに共通のファイルを除いて、異なる値を持ちます。私は各インスタンスにコピーを持たせたくありません。私はそれを静的(すべてのために1つのコピー)したい。しかし、それぞれの異なるサブクラスは異なるファイルを使用します。各サブクラスは、スーパークラスからのファイルを持っていることをFACTに継承させたい。

EDIT:クイック概要:

目標:変数可能、 は サブクラスの定義を構築しているクラスを作成します。 - すべてのサブクラス に登場する - にユニークな特定のサブクラス - 特定のサブクラスのすべてのインスタンスによって共有される(すべて1部のコピー)

コード:

var instance1ofSubclass1 = { 
    staticVar:"SAMEVAL_1", // For brevity I'm showing how staticVar is 
          // the same. It's notsupposed to be public. 
    uniqueVar:"adsfasdf" 
}; 
var instance2ofSubclass1 = { 
    staticVar:"SAMEVAL_1", 
    uniqueVar:"zxbvczbxc" 
}; 
var instance3ofSubclass1 = { 
    staticVar:"SAMEVAL_1", 
    uniqueVar:"qwrtytry" 
}; 

var instance1ofSubclass2 = { 
    staticVar:"SAMEVAL_2", //<--notice the static var is different 
          // between subclasses 
    uniqueVar:"oipoiuu" 
}; 
var instance2ofSubclass2 = { 
    staticVar:"SAMEVAL_2", 
    uniqueVar:"hljkhlj" 
}; 
var instance3ofSubclass2 = { 
    staticVar:"SAMEVAL_2", 
    uniqueVar:"bnmbmbmnm" 
}; 

私のクラス定義次のように行くことができる:

var subclass1 = (function() { 
    var staticVar = "SAMEVAL_1" 
    return function (unique) { 
     return { 
      uniqueVar:unique 
     }; 
    }; 
}()); 

var subclass2 = (function() { 
    var staticVar = "SAMEVAL_2" //<-- different static variable 
    return function (unique) { 
     return { 
      uniqueVar:unique 
     }; 
    }; 
}()); 

、私はさらに一歩進み、これらのクラスのスーパークラスを作りたいです。それは私が立ち往生している場所です。 I すべてのサブクラスにstaticVar定義を持たせたい。私はスーパークラスからそれを取得したい。

+1

あなたが求めているものを私は完全には明らかではありませんよために。何を書いたかったのか、それがあなたのニーズを満たしていない理由を明確にすることはできますか? – Phrogz

+0

@Phrogz:私はそれを編集します。私はそれを完全に編集するか、最後に大きな編集を追加するだけですか? – JustcallmeDrago

+0

@JustcallmeDrago私は大きな添付編集、または明快にするための書き直しに行くだろう。 :) – Phrogz

答えて

0

私はそれを理解したと思います。

フィドル:http://jsfiddle.net/zXMaM/

私が作成したパターンが必要なプライベート静的変数のための追加の閉鎖を作成し、同時に作成されたオブジェクトを強化し、他の機能(基本的にスーパークラス)を介して、クラス定義を送信クラスがプライベート静的変数にアクセスするために渡されます。

これは私にとっても新しくても説明がつきませんが、コードと私のコメントの間にはうまくいきます。

"スーパークラス" 方法:

var superClass = function (yourPrivateStaticVar, classDef) {   
    var privateStatic = yourPrivateStaticVar; 

    return function() { // return a new constructor (only invoked when a new 
         // instance is created!) 

     // run the constructor, grab the object it creates 
     var newObj = classDef(); 

     // now, augment the object created (these vars/methods have no 
     // knowledge of the subclass!) 

     //add private vars/methods to the object 
     function getPrivStatic() { 
      return privateStatic; 
     } 

     var example_inherited_private_var; 

     //add public vars/methods to the object 
     newObj.getPrSt_directly = function() { 
      return privateStatic; 
     } 

     newObj.getPrSt_throughPrivateFunc = function() { 
      return getPrivStatic(); 
     } 

     newObj.example_inherited_public_var = "something"; 

     //return the augmented object (a new *instance* of the subclass) 
     return newObj; 
    }; 
}; 

"サブクラス" の定義:もう一度

//pass the definition of subclass1 through the superclass method and get it back 
var subClass1 = superClass("yourChosenPrivateStaticValue", function() { 
    //private variables/methods go here 

    return { //this is the actual instance object 
     //public variables/methods go here 
    }; 
}); 

、フィドル:http://jsfiddle.net/zXMaM/

0

最初に、コンパイラはないので、何かを忘れることはありません。それは私たちがなくても生きなければならないものです。

私はあなたのためにこのためのプロトタイプを使用することです。スーパークラスのプロトタイプに変数が含まれている場合は、同じインスタンスがすべてのサブクラスで使用されます。そしてあなたはあなたのサブクラスのファイルで自分自身を繰り返す必要はありません。静的で、継承され、話す。

MySuperClass.prototype.myStaticVar = "giantFile"; 

このソリューションの欠点は、変数が実際にプライベートではないことです。一方、あなたは本当に本当にプライベートである必要がありますか?

プライバシーの概念は、とにかく少し面白いです。 C/C++では、すべてのもの(私的なものも)はポインタマジックによってアクセスできます。 C#では、リフレクションを使用してプライベート変数を変更することができます。何も本当にプライベートではありません。 JavaScriptは、ブラウザのスクリプトをエンドユーザ自身が変更できるので、さらに楽しいです!私の意見では、明白な視界に隠れて、この場合に行く方法です。変数に適切な名前を付けます(たとえば、「プライバシー」を表すために名前の先頭にアンダースコアまたは2を追加します)。

+0

本当に本当ですか?はい、私は本当に本当です。それはプライベートにする必要があります! – JustcallmeDrago

+0

ハハ、ok :)私は、次に動作する別のオプションについて考えようとします。 – Jakob

+0

申し訳ありませんが、私の質問を編集したので、あなたの答えはおそらく今や絶対に意味をなさないでしょう! – JustcallmeDrago

0

私はこの権利を読んでいれば、あなたと同様の問題がありました。これは私が数週間前に投稿したSO questionをチェックしてください。

はさらに一歩、私の .add()方法は、それが簡単に持つことができるように、それはその名前空間に suprと呼ばれるベースオブジェクトを追加していない場合は、名前空間に渡され、それに接続さ suprを目的としているかどうかをチェックしていること取りますルートへのアクセス。

関連する問題