C#具有继承的对象数组

时间:2015-05-14 15:00:22

标签: c# object inheritance

从子类中获取值时遇到问题。

class petstore
{
    public string name;
    public int age;

    public petstore(string name,int age)
    {
         this.name=name;
         this.age=age;
    }
}

class dog:petstore
{
    public string dogtype;

    public dog(string name, int age,string dogtype): base(name,age)
    {
        this.dogtype=dogtype;
    }
}

class cat:petstore
{
    public string cattype;

    public cat(string name, int age,string cattype): base(name,age)
    {
        this.cattype=cattype;
    }
}

我将该代码作为一个类。现在我需要从一个对象数组中获取cattype或dogtype。 如果我这样做了

petstore[] pets=new petstore[3];
pets[0]=new dog("ben",1,"Poodle")
pets[1]=new cat("meow,2,"Persian")

如何使用数组pets []获取dogtype或cattype的值? 可能吗? 对不起,我是新来的。

2 个答案:

答案 0 :(得分:0)

欢迎来到StackOverflow,以及一般的发展世界。不幸的是,从风格角度来看,这段代码存在很多问题,所以如果你不介意我会把这些想法和你实际问题的答案都放在一起。

1)尝试在您正在使用的任何平台上遵循标准样式约定。对于.NET,这意味着在命名类或方法时使用PascalCasing。

.NET Style Guide

public class PetStore {
     public void SomeMethodForTheStore() {}
}

2)在进行面向对象编程时,重要的是尝试在对象所代表的系统实体之后建模对象。在您的情况下,您已将CatDog声明为PetStore的子类。这是另一种说法,“狗是一种宠物店”。这没有任何意义。据我所知,没有狗可以容纳一排排成排的笼子供动物人们走过去买宠物。

调用您的超类Pet更合适。

public class Dog : Pet {}

3)最后,我相信这是您实际问题的答案,您要做的事情称为投射。这意味着您正在获取可能包含在更通用类型中的对象,并尝试将其移动到更具体的类型,以便您可以利用可能仅存在于该特定子类上的方法和属性。在这种情况下,这是dogtypecattype。它还要求您知道要转换的实例是您要将其强制转换为的特定类型。

// Create a polymorphic array of pets
Pet[] pets = new Pet[3];
pets[0] = new Dog("ben",1,"Poodle");
pets[1] = new Cat("meow,2,"Persian");

我们知道在这种情况下数组的第一个元素是Dog,第二个元素是Cat。因为我知道这一点,我可以将这些宠物的实例转换成它们的特定类型。

// Cast these Pets into their respective types and 
// and access their highly specialized behavior!
Dog dog = (Dog) pets[0];
Console.WriteLine(dog.DogType);

Cat cat = (Cat) pets[1];
Console.WriteLine(cat.CatType);

答案 1 :(得分:0)

看起来我们可能需要退后一步,确保我们知道你想做什么。

我的印象是,你的项目目标是拥有一个宠物商店,它有不同的宠物。

我猜你想保持这个简单,所以考虑到这一点;这些是我们可以从上面的陈述中评估的东西,如下所示:
宠物
宠物
一个宠物商店有很多宠物 - 这部分可能会变得很奇怪,但我们现在会保持简单并使用你所展示的阵列。

由于猫和狗宠物 - 制作一个名为Pet的基类 现在做宠物的孩子的狗和猫类 现在让PetStore成为一系列宠物并添加你的宠物(狗和/或猫)。

这有意义吗?

严格来说,有更好的方法可以做到这一点,但这应该保持简单。 :)