問題タブ [nested-class]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - ネストされたクラスをどこでどのように使用するのですか?
クラスが別のクラスでのみインスタンス化される場合は、そのクラスにネストして使用するのが正しいと考えています.これは良い設計に役立つと思います.私のプロジェクトを見ると、そのようなネスト構造はほとんど見たことがありません.しかし、クラスをネストしようとすると、今度は別の質問が頭に浮かびます.たとえば
Board クラス、ShortCastle、LongCastle、EnPassant、Promote などの Move クラスと、Pawn、Queen、Rook、Knight などの Pieces があります。したがって、Board クラスが Piece クラスをインスタンス化し、Piece クラスが Move クラスをインスタンス化することは明らかです。優れた設計では、プロモート ムーブ クラスはポーンのネストにする必要があります。これは、ポーンだけが自身をプロモートできるためです。短いキャッスルと長いキャッスルはキングのネストにする必要があります。キングだけがそのようなタイプのムーブを持つことができるからです。
すべての Piece クラスを Board クラスに入れようとすると、8 ~ 9 クラスが Board クラス内に配置され、1 つの Board クラス ファイルが大きすぎて読みにくくなるため、見栄えがよくありません。ファイル。部分的なボード クラスを作成できるのは良いことですが、それでも、8 ~ 9 個の部分的なボード クラス ファイルが各ピース クラスを保持するのは面倒ではありませんか? それらを入れ子にしない方が良いですか?Pieces についても同じです 別の Move タイプ クラス用に別の部分的な Piece ファイルを作成しますか? ネストされたクラスが小さなスペースしかとらない場合は問題ありませんが、多くのメソッドが必要な場合は?
c++ - ネストされたクラスを使用した奇妙なenable_ifの動作(MSVCコンパイラのバグまたは機能?)
コードのデバッグにかなりの時間を費やした後、enable_ifを使用して、問題の理由を予期しないテンプレートの特殊化の結果まで追跡しました。
次のコードは、Visual Studio 2010(および2008)のDoTest()でのアサーションに失敗しますが、g++3.4.5では失敗しません。ただし、SomeClassからテンプレートを削除するか、 my_conditionをSomeClassのスコープ外に移動すると、MSVCでも機能します。
この動作を(少なくとも部分的に)説明するこのコードに何か問題がありますか、それともこれはMSVCコンパイラのバグですか?
(このサンプルコードを使用すると、boostとc ++ 0x stlバージョンで同じです)
条件をスコープ外に移動して修正しようとすると、std :: enable_ifを使用する場合でもこれでは不十分であることに気付きましたが、少なくともboost :: enable_if:で機能します。
誰かがこれについて説明してくれることを願っています。
nhibernate - ネストされたクラスに対する NHibernate クエリ
私はNHibernateを使用しています。ネストされた型を持つクラスがあります。NHibernate を使用して、ネイティブ SQL クエリを使用する以外に、ネストされた型に対してクエリを実行する方法はありますか?
現在、ネストされたクラスは HQL では許可されていません。
編集: 外側のクラスには、ネストされたクラス インスタンスの IList があります。
c++ - テンプレートフレンドとネストされたクラス
次のコードを検討してください。
foo<T>::bar
のすべてのインスタンス化を、の友達にしたいと思いfoo<T>::bar<S>
ますS
。がネストされたテンプレートでない場合bar
、上記の構文は問題なく機能します。しかし、私が例えばそうするとき
MSVC8(Visual C ++ 2005)はそれを好きではありません:
コンパイラを使用すると、同じエラーが発生します
代わりは。どうすれば私が望むことを達成できますか?
編集:私はダブルチェックしました(ここは朝です、そして私は本当に起きていません)、これはVC8のバグのようです:
c# - ネストされたクラスを使用する理由は何ですか?
このstackoverflowの回答では、コメント投稿者が「プライベートネストされたクラス」は非常に役立つ可能性があると述べたので、ネストされたクラスが技術的にどのように機能するかを説明する傾向があるこのような記事でそれらについて読んでいましたが、それらを使用する理由は説明していません。
より大きなクラスに属する小さなヘルパー クラスにはプライベート ネスト クラスを使用すると思いますが、多くの場合、別のクラスのヘルパー クラスが必要になるため、(1) ネストされたクラスを非-nested または (2) public にしてから、outer-class プレフィックスを付けてアクセスします。これはどちらも、最初にネストされたクラスを持つための付加価値のない余分な作業のようです。したがって、一般的に、おそらくクラスをグループにもう少し整理する以外に、ネストされたクラスのユースケースは実際には見られませんが、それは私が楽しむようになったファイルごとに1つのクラスという明確さに反します.
コードをより管理しやすく、読みやすく、効率的にするために、ネストされたクラスをどのように使用しますか?
ruby - Ruby でネストされたクラスを参照しようとするとエラーが発生するのはなぜですか?
次の例でエラーが発生するのはなぜですか?
ClassE
を入力するのではなく、を作成する別の方法はありますclass ClassA; class ClassE
か?
python - (Python)予期しないときに作成されたクロージャ
ネストされたクラスを作成するときに予期しないクロージャが発生しました。これはメタクラス、スーパー、またはその両方に関連するものだと思います。これは、クロージャがどのように作成されるかに間違いなく関係しています。私はpython2.7を使用しています。
これが私が見ているのと同じ問題を示す5つの単純化された例です(それらはすべて最初のものから構築されます):
例1:
例2:
例3:
例4:
例5:
これが私が理解していることです(例を参照):
- メタクラスは継承されるため、のメタクラス
Subclass
を取得しBase
ます。 - 影響を受けるのは影響を受けるだけ
__init__
で、Subclass.other
メソッドは影響を受けません(#1)。 - 削除
Subclass.other
しても違いはありません(#1)。 self.name=name
から削除しSubclass.__init__
ても違いはありません(#1)。- クロージャセル内のオブジェクトは関数ではありません。
- オブジェクトは
Metaclass
またはではありませんが、 (#1)と同じようBase
に、タイプのオブジェクトがあります。Metaclass
Base
- オブジェクトは、実際にはネストされたタイプ
Subclass
(#1)のオブジェクトです。 - とのクロージャーセルは
t1.subclass.__init__
、t1.subclass2.__init__
2つの異なるクラス(#1)からのものですが、同じです。 Subclass
(#1)の作成をネストしない場合、クロージャーは作成されません。- 電話をかけないと
super(...).__init__
、Subclass.init__
クロージャーは作成されません(#2)。 - noを割り当て
__metaclass__
てから継承するとobject
、同じ動作が表示されます(#3)。 - のクロージャセルのオブジェクト
t3.other.__init__
はt3.other
(#3)です。 - メタクラスに
__init__
(#4)がない場合も、同じ動作が発生します。 Base
がない場合__init__
(#4)も同じ動作が発生します。- 例4の3つのサブクラスのクロージャーセルはすべて異なり、それぞれが対応するクラス(#4)と一致します。
- をに
super(...).__init__
置き換えるとBase.__init__(self)
、クロージャーが消えます(#5)。
これが私が理解していないことです:
- なぜクロージャーが設定されるの
__init__
ですか? - なぜクロージャーが他のクロージャーに設定されないのですか?
- クロージャーセル内のオブジェクトが、
__init__
属するクラスに設定されているのはなぜですか? super(...).__init__
が呼び出されたときにのみこれが発生するのはなぜですか?Base.__init__(self)
が呼び出されたときになぜこれが起こらないのですか?- これは実際にはメタクラスの使用とはまったく関係がありますか(おそらく、デフォルトのメタクラスは
type
)ですか?
助けてくれてありがとう!
-エリック
(更新)これが私がその時見つけたものです(ジェイソンの洞察に基づいて):
まず、関数の名前はそれ自体の本体内のスコープ内にあります。次に、関数は、それらの関数を参照する場合、それらが定義されている関数のクロージャを取得します。
関数名がそのようなスコープにあることに気づいていませんでした。同じことがクラスにも当てはまります。クラスが関数のスコープ内で定義されている場合、クラスのメソッド内でそのクラス名を参照すると、次のように、クラスはそのメソッドの関数のクロージャにバインドされます。
ただし、非関数に対してクロージャを作成できないため、以下は失敗します。
良いもの!
java - インターフェイス内にクラスをネストすることは良い考えですか?
Javaのインターフェース内に内部クラスを持つことは可能ですか???
python - プロパティとしての疑似辞書
私は、2つのC
疑似 と を持つべきPythonクラスを持っています。疑似辞書という用語は、辞書が実際には存在せず、キーがアクセスされるたびに「再計算」されることを意味します。dict
a
b
擬似コードでは、これは次のようになります。
a
とのクラスを実装することもできますb
が、どちらもいくつかの短いメソッドしかないため、これを行うためのよりエレガントでコンパクトな方法があるかどうか疑問に思います。
java - ネストされたクラスを別々のファイルに入れる
ネストされたクラスを含むファイルがありますが、読み取り不能になるほど長くなっています。ネストされたクラスを別々のファイルに分割する方法はありますか?