0

ifステートメント内で変数を宣言する必要があります。その後、外側に使用します。しかし、私の知る限り、C# には外部変数はありません。しかし、私はこれを行う必要があります。

1 つのクラスから派生した 2 つのクラスがあります。

基本クラス:Operand 派生クラス:NormalOperand SpecialOperand

bool normal

どこかで宣言

if(normal)
    NormalOperand o = stack.Pop() as NormalOperand;
else
    SpecialOperand o = stack.Pop() as SpecialOperand;

以下では、この違いについて扱いたくありません。それを行うハックはありますか?それとも、これに関連することをするすべての場所でそれに対処する必要がありますか?

4

5 に答える 5

4

問題はありません。o基本クラスとして宣言するだけOperandです。

Operand o = stack.Pop(); // add as Operand if needed

後でタイプを知る必要がある場合o(基本クラスで仮想/抽象メソッドを使用すると、これを回避する必要があります)、次を使用します。

if (o is NormalOperand)
{
    // TODO: maybe check for null
    (o as NormalOperand).NormalSpecificMethod();
}
于 2011-10-26T10:03:47.767 に答える
1

通常、if ステートメントの前に変数を宣言し、 として宣言する必要がありますOperand。この状況では、if ステートメントはまったく必要なく、. も必要ありませんboolean normal。として宣言し、Operandポリモーフィズムを使用して、他に必要なことを行うだけです。

Operand o = stack.Pop() as Operand;

あなたが言うように、以下の違いに対処したくないので、 o が特別かどうかを知る必要はありません。それともあなたですか?

于 2011-10-26T10:07:38.467 に答える
1

私が理解しているように、このような変数を外部として宣言する唯一の理由は、それらに対して異なるメソッドを呼び出したいからです。

例えば:

 normal = true;

 ...

 o.DoSomethingNormal()

 normal = false;
 o.DoSomethingSpecial();

このコードを見て、C# が静的に型付けされた言語であることを理解すると、これが決してコンパイルできないことがわかるでしょう。

ただし、Normal と Special の両方で宣言されているメソッドを呼び出したい場合は、このメソッドを Interface または基本クラスで宣言し、stack.Pop() をその型にキャストする必要があります。そうすれば、ポリフォームを使用でき、機能します。

あなたの場合:

Operand o = stack.Pop() as Operand;
o.DoSomething();
于 2011-10-26T10:04:59.873 に答える
0

あなたはできるはずです:

bool normal = ...

Operand o = null;
if (normal) o = stack.Pop() as NormalOperand; Enter code here`else o = stack.Pop() as SpecialOperand;

私はそれを理解しているかどうかはわかりません。つまり、これは、ステートメント内で他のことを行う必要がある場合にのみ意味がありますif。それ以外の場合は、George が提案するように、いつでもo = stack.Pop()as および null チェックを使用して型をチェックできます。

于 2011-10-26T10:05:47.097 に答える
0

まず、これらの一時的なものが両方とも消えてしまうので、あなたの例は意味がありません。しかし、その少しを無視しましょう。

これらのオペランドが同じスタック上にある場合、それらは両方とも共通のクラスから派生していると想定できます。だと思いますOperand

Operand o = Stack.Pop();

また、このコードで何かをしたいと思っていると思います。それは何ですか?なんで知らなきゃいけないの?それがどのタイプか知りたいだけなら、次のように言えます。

if(o.GetType() == typeof(NormalOperand))
{
}
else if(o.GetType() == typeof(SpecialOpernad))
{
}
于 2011-10-26T10:08:59.727 に答える