まず、仮想静的機能が動作しない理由の別の質問ではありませんので、コンパイラが仮想と静的をどのように見ているかを解説したり、これらの質問の重複としてフラグを立ててください私の例に合った答えをあなたが知っていれば、自由にリンクして、重複していることに気をつけてください。"Virtual Static"には何があるのでしょうか?単純な例文の場合
このようにして解決されたものを実装する方法を探ることによって、「なぜあなたはそれを行う必要があるのかわからない」と多くの人がいます。私には非常に異なる例があるので、同じ質問をしてください。だから私は他人の答えに関連づけるのが難しいと思っています。
このゲームでは、私は単純なInventory
とItem
システムを持っていたいと思っています。 Inventory
クラスは
public class Item {
public virtual static Sprite getIcon();
public virtual static string getName();
}
public class Stone : Item {
static Sprite icon;
static string name = "Stone";
public override static Sprite getIcon(){
return icon;
}
public override static string getName(){
return icon;
}
// ...
}
そう思ったが、基本的にあなたのInventory
でそのすべてのStone
株式同じicon
であり、すべての石が同じ名前/タイトルを持っていることを、デバッグに使用するための言うことを認識することができることをvirtual class
からすべてItem
継承メッセージを表示したり、プレーヤーが見ているものやピックアップしているものに関するメッセージをプレーヤーに与えたりすることができます。
今、すべての私の根性は、ベストプラクティスはInventory
でStone
のすべてのインスタンスが同じicon
を示さなければならないので、Sprite
は、static
でなければならないことであることを教えてください。ただし、すべての種類のアイテムにはSprite
も含まれている必要があります。したがって、get
-methodを取得するのはinherit
です。
私が思いついた2つの選択肢は、従来は間違っていたり、過度に間違っていると感じます。
1)get
-methodsをstatic
にして、静的メンバーの内容を返すようにします。これは、戻り値がすべてのインスタンスで同じであるクラスのすべてのインスタンスに対してオーバーヘッドを作成するので、従来とは異なります。
編集:修正:余分なオーバーヘッドがないため、この方法が有効です。
2)は、すべてのスプライト/名前を格納し、指定されたオブジェクトのタイプに基づいて、それらを返すいくつかのマスタークラスを作成します。まず第一に、タイプ比較/チェックを使用するのは好きではありません。できるだけそのようにするのが最善であるという印象です。しかし、たとえそうであっても、このソリューションは、私は何かが欠けていない限り、string
またはSprite
参照だから、
を返すようなささいなタスクのためにやり過ぎのように私は感じて、これを達成するのストレートフォワードな方法何もありませんか?それとも私の2つの方法のうちの1つは、私が思うよりも優れていますか?
PS:私は統一は、私はすべての耳だソリューションを提供しますので、もしつもりが、ユニティゲームのためにこれを実装しますよ。私が述べた最初のソリューションは、実際に私が探していたストレートフォワードな答えであることがわかったコメンターからいくつかの明確化
*これは、戻り値がすべてのインスタンスで同じであるクラスのすべてのインスタンスに対してオーバーヘッドを作成するため、これには類を見ないものです。*仮想メソッドにはインスタンスごとのオーバーヘッドはありません。 – PetSerAl
@PetSerAl間違った用語を使用した可能性があります。しかし、そのようなメソッドに静的メソッドを使用しないというメモリ/パフォーマンスの欠点はまったくないと言っていますか? – Chexxor
@Chexxor correct、それにペナルティはありません。プライベート静的フィールドを参照する通常の仮想メソッドを作成するだけです。 –