2017-01-08 10 views
0

私は、次の3つのクラスがあります。子不明の子クラスから関数を呼び出すにはどうすればよいですか?

class Item 
{  
    protected String itemType; 

    public String getItemType() 
    { 
     return itemType; 
    } 
} 

class Weapon:Item 
{ 
    private int power; 

    public int getPower() 
    { 
     return power; 
    } 
} 

class Armour:Item 
{ 
    private int defence; 

    public int getDefence() 
    { 
    return defence; 
    } 
} 

を武器とアーマーは、項目からプロパティを継承します。

次に、関数がこれを好んでいます。

public Item getItem() 
{ 
    return new Weapon(); 
} 

私の問題は、私はこのような何かをする必要があるが、それは動作しません:

Item item1 = getItem(); 

if(item1.getItemType().Equals("weapon")) 
    lblText = item1.getPower(); 
else 
    lblText = item1.getDefence(); 

をI、明らかにクラスの項目がgetDefenceのような機能を持っていないことを示すエラーメッセージを取得()またはgetPower()です。 誰も私がこれをどうやって管理できるか知っていますか?

+2

他のものとは別に、プロパティとC#命名規則について学ぶのが良い時期です。現在のところ、このコードはC#よりもJavaに似ています。 –

答えて

1

あなたが必要なものを達成するためにgetItemType()は必要ありません。 C#isオペレータを使用してこれを行うことができます。から引用:MSDN

オブジェクトが特定の型と互換性があるかどうかを確認します。

if (obj is MyObject) 
{ 
} 

あなたは、このようにコードを変更することができます:

Item item1 = getItem(); 

if (item1 is Weapon) 
{ 
    lblText = ((Weapon)item1).getPower(); 
} 
else if (item1 is Armour) 
{ 
    lblText = ((Armour)item1).getDefence(); 
} 
をたとえば、 次のコードは、オブジェクトが MyObjectにタイプ、またはMyObjectをから派生した型のインスタンスであるかどうかを判断することができます

また、C#の命名規則に従って、メソッド名にキャメルケーシングを使用する必要があります。getDefence()の代わりにGetDefence()にする必要があります。

1

希望の動作を実現するには、タイプItemitem1オブジェクトをタイプWeaponまたはArmourにそれぞれキャストする必要があります。例えば

:また

if(item1.getItemType().Equals("weapon")) 
    lblText = ((Weapon)item1).getPower(); 
else 
    lblText = ((Armour)item1).getDefence(); 

、あなたのitem1オブジェクトは「武器」の文字列と等しくないitemTypeが含まれている場合、鋳造は、実行時に例外がスローされますので注意してください。主に、getItem()メソッドはタイプWeaponのオブジェクトを作成するためです。

関連する問題