使用基类将对象添加到集合中

时间:2012-08-06 18:09:17

标签: c#

我有两个自定义对象,比方说CatDog。我想创建一个observable collection来保存这些对象中的任何一个,因为它们非常相似。我可以使用基类来做到这一点吗?

如果是这样,你介意提供一个简单的例子。

如果我使用基类,这是否意味着如果我想使用公共字段,我应该把它们放到基类中?

编辑:我希望然后将WPF数据网格绑定到这些对象的属性。我不知道是否可以将WPF中的数据网格绑定到两种不同类型的对象......

3 个答案:

答案 0 :(得分: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";
    }
}

但请注意,当您将两个类的实例放在一个集合中时,您可以访问 base 类的成员。 所以这段代码是有效的:

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

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

但除非使用显式转换,否则不能使用方法Meow()和Bark()。

小心将太多成员移动到基类 - 在上面的示例中,Meow()对Cat的Dog和Bark()没有意义。如果需要使用某些特定于派生类的方法,可以使用以下方法检查类型:

pet.GetType() 

然后将对象强制转换为派生类型:

var cat = (Cat)pet;
cat.Meow();

答案 1 :(得分:1)

是。你可以使用基类说动物。是的,如果他们有共同的字段,如姓名,类型等,他们可以去那里。

class Animal {
    public String name;
}

然后扩展它。但您也可以扩展功能。

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

现在任何要求动物类型的东西都可以收到狗。

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

这实际上是Java的Object的主干。

答案 2 :(得分:0)

是属性,这是基类的重点。您表达了基础中的共性和派生类中的特殊性。至于基类是否是可观察集合的最佳位置,它取决于。您需要更深入地了解需求和预期用途。虽然这是可行的。

同时查看ObservableCollection<T>