0

私は 2 つのカスタム オブジェクトを持っていCatますDogobservable collectionこれらのオブジェクトは非常に似ているため、これらのオブジェクトのいずれかを保持できるを作成したいと考えています。これを行うために基本クラスを使用できますか?

もしそうなら、簡単な例を提供していただけませんか。

また、基本クラスを使用する場合、共通フィールドを使用したい場合は、それらを基本クラスに入れる必要がありますか?

編集:WPF データグリッドをこれらのオブジェクトのプロパティにバインドしたいと考えています。WPF のデータグリッドを 2 つの異なる種類のオブジェクトにバインドできるかどうかはわかりません...

4

3 に答える 3

5

はい、その場合、基本クラスを使用できます。

public class Pet
{
    public int Id { get; set; }
    public string Name { get; set; }

    public void Run() { }
}

public class Cat: Pet
{
    public string Meow()
    {
        return "Meow";
    }
}

public class Dog :Pet
{
    public string Bark()
    {
        return "Whow";
    }
}

ただし、両方のクラスのインスタンスを 1 つのコレクションに配置すると、基本クラスのメンバーにしかアクセスできないことに注意してください。したがって、このコードは有効です:

var collection = new ObservableCollection<Pet> {new Cat(), new Dog()};

foreach (var pet in collection)
{
   pet.Run();
}

ただし、明示的なキャストを使用しない限り、メソッド Meow() および Bark() を使用することはできません。

基本クラスに移動するメンバーが多すぎる場合は注意してください。上記の例では、Meow() は Dog には意味がなく、Bark() は Cat には意味がありません。派生クラスに固有のメソッドを使用する必要がある場合は、次の方法で型を確認できます。

pet.GetType() 

次に、オブジェクトを派生型にキャストします。

var cat = (Cat)pet;
cat.Meow();
于 2012-08-06T18:28:40.463 に答える
1

はい。基本クラスの動物を使用できます。はい、名前、タイプなどの共通フィールドがあれば、そこに入ることができます。

class Animal {
    public String name;
}

後は伸ばすだけです。ただし、機能を拡張することもできます。

class Dog extends Animal {
    public void bark();
}

Animal 型を要求するものはすべて、Dog を受け取ることができます。

public void addToCollection(Animal animal)
addToCollection(new Dog());

これは、実際には Java のオブジェクトのバックボーンです。

于 2012-08-06T18:12:02.110 に答える
0

はい、プロパティに、それは基本クラスのポイントのようなものです。基本クラスの共通性と派生クラスの特異性を表現します。基本クラスが観察可能なコレクションに最適な場所であるかどうかについては、まあ、それは異なります。必要性と予想される使用法について、もう少し洞察を与える必要があります。しかし、それは実行可能です。

ObservableCollection<T>もチェックしてください。

于 2012-08-06T18:19:06.260 に答える