-1

私は立ち往生しているAnimalModelプログラムを持っています。このプログラムには、サブクラスの哺乳類、昆虫、鳥、爬虫類、および海洋を持つ抽象クラスの動物が含まれています。すべてのサブクラスには、動物のサブクラスがさらに 2 つあります。

たとえば、哺乳類には Wolf と Dog というクラスがあります。

私の問題は、動物のアイテムを配列に追加する方法を作成したことです。

たとえばオオカミや犬を含むリストビューのオブジェクトを哺乳動物オブジェクトにキャストしようとしていますが、成功しません..

私は2つの方法で試しましたが、どちらも機能しません..

private void AddAnimalItem() 
{
    string m_age = txtAge.Text;
    string m_Name = txtName.Text;

    CategoryType m_CategoryType = (CategoryType)(lstCtgr.SelectedIndex);
    Animals animal = null;

    switch(m_CategoryType)
    {
        case CategoryType.Mammal:

            // first attempt
            Mammal mammalspecies  = (Mammal)Enum.Parse(typeof(Mammal),
                                        lstAnml.SelectedItem.ToString());

            // second attempt
            Mammal mammalspecies = lstAnimal.SelectedItems.Cast<Mammal>();

            // Static method for creating an Mammal to an animal
            animal = Mammal.MammalFactory(mammalspecies);
            break;
    }

    /* ... */
 }
4

2 に答える 2

0

あなたは本当にあなたの質問にもっと情報を提供するべきです. 十分な情報が提供されていないため、いくつかの仮定を立てる必要があります:-

  • Mammal列挙型ではなくクラスです。(列挙型にはサブクラスまたはサブ列挙型を含めることができないためです。)
  • CategoryTypeはクラスではなく列挙型ですが、その値の 1 つはMammal (つまりCategoryType.Mammal) とも呼ばれます。
  • lstAnmlListBoxであり、その値は哺乳動物サブクラスの完全修飾クラス名である文字列です (例: "MyNamespace.Wolf""MyNamespace.Dog")。
  • MammalWolf、およびDogクラスにはすべて、パラメーターなしのコンストラクターがあります。

上記の仮定が間違っている場合は、不足している情報で質問を更新してください。

上記の仮定が正しい場合は、1 回目または 2 回目の試行を次のように置き換えてください。

Type mammaltype = Type.GetType(lstAnml.SelectedItem.ToString());
Mammal mammalspecies = (Mammal) Activator.CreateInstance(mammaltype);

ただし、最後のステートメントのロジックは間違っているようです。クラスインスタンスではなく、列挙Mammal.MammalFactory()型をパラメーターとして受け取る必要があります。しかし、本当に列挙型の場合、サブクラスを持つことはできません...Mammal

Mammalしたがって、本当に列挙型ではなくクラスであると仮定すると、最後のステートメントは次のようになります。

animal = mammalspecies;
于 2012-07-30T23:41:31.050 に答える
0

このコードには多くのことをお勧めしますが、その中で最も少ないものは次のとおりです。

  1. lstCtgr では、序数を別の型 (e​​num だと思います) にキャストしないので、アイテムのテキスト表現 (ToString) を含むリスト アイテム クラスをクリアし、実際の CategoryType を順序とは独立して取得することができます。リスト。
  2. lstAnimal でも同様のことを行います。序数を超えて選択されたものに関する情報を取得する必要がある場合は、その情報を提供する lstAnimal に追加できるクラスを作成します。lstCtr と同様に、ToString を実装し、Mammal オブジェクトへのアクセスを提供する型で。

しかし、何をする必要があるのか​​、投稿したコードで何をしようとしているのかさえ、非常に不明確です。動物のカテゴリ (lstCtgr)と実際の動物 (lstAnml)の両方を選択するのは意味がありません。動物が lstAnml にいるものは、lstCtr から完全に独立しているようです。

于 2012-07-30T23:08:00.017 に答える