2

次のコードが実行されます。

ClassA myClass = new ClassA()
myClass.varA = "Teststring"

BaseClassB cls = new BaseClassB()
cls.methodA(myClass)

私は次のクラスを持っています

class BaseClassA
{

}

class ClassA:BaseClass
{
   string varA;
}

class ClassB:BaseClass
{
   string varB;
}

次に、1つの方法

class BaseClassB
{
   public void methodA(BaseClassA myVar)
   {
      // How can I display varA that is given with myClass (which is myVar)?
      // It should also be able to display varB when an object of type ClassB is given
      // So I have to make a downcast here but I don't know if I have to downcast to ClassA or ClassB
   }
}

これが主な知識であることは知っていますが、誰かが私を助けることができますか?

4

2 に答える 2

7

おそらく、指定した場所にコードを配置するのではなく、コードを再構築したいと考えているでしょう。基本クラスの要点は、ClassA と ClassB を同じように扱えることです。それらを別の方法で扱いたい場合は、ClassA および ClassB オブジェクトを受け取るオーバーロードを使用します...

class BaseClassB
{
    public void methodA(ClassB myVar)
    {
        Console.WriteLine(myVar.varB);
        methodCommon(myVar);
    }
    public void methodA(ClassA myVar)
    {
        Console.WriteLine(myVar.varA);
        methodCommon(myVar);
    }
    public void methodCommon(BaseClassA myVar)
    {
    }
}

1つの方法で本当に必要な場合は、次のことができます。

public void methodA(BaseClassA myVar)
{
    if (myVar is ClassA)
    {
        //Its of type ClassA so you can do whatever you want with it knowing it is a ClassA.
    }
    else if (myVar is ClassB)
    {
        //Its of type ClassB so you can do whatever you want with it knowing it is a ClassB.
    }
    else
    {
        //Its not either.
    }
}
于 2013-07-10T10:42:26.927 に答える
2

myVar が ClassA または ClassB のいずれかであることが確実な場合は、次のようにすることができます。

string s;
var myvarA = myVar as ClassA;
if (myvarA != null)
{
    s = mayVarA.varA;
}
else
{
    s = ((myvarB)myVar).varB;
}

myVar が別のものである可能性がある場合は、ClassA と同じテストを ClassB に対して行うことができます。

于 2013-07-10T10:39:27.693 に答える