从子类中获取值时遇到问题。
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的值? 可能吗? 对不起,我是新来的。
答案 0 :(得分:0)
欢迎来到StackOverflow,以及一般的发展世界。不幸的是,从风格角度来看,这段代码存在很多问题,所以如果你不介意我会把这些想法和你实际问题的答案都放在一起。
1)尝试在您正在使用的任何平台上遵循标准样式约定。对于.NET,这意味着在命名类或方法时使用PascalCasing。
public class PetStore {
public void SomeMethodForTheStore() {}
}
2)在进行面向对象编程时,重要的是尝试在对象所代表的系统实体之后建模对象。在您的情况下,您已将Cat
和Dog
声明为PetStore
的子类。这是另一种说法,“狗是一种宠物店”。这没有任何意义。据我所知,没有狗可以容纳一排排成排的笼子供动物人们走过去买宠物。
调用您的超类Pet
更合适。
public class Dog : Pet {}
3)最后,我相信这是您实际问题的答案,您要做的事情称为投射。这意味着您正在获取可能包含在更通用类型中的对象,并尝试将其移动到更具体的类型,以便您可以利用可能仅存在于该特定子类上的方法和属性。在这种情况下,这是dogtype
和cattype
。它还要求您知道要转换的实例是您要将其强制转换为的特定类型。
// 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成为一系列宠物并添加你的宠物(狗和/或猫)。
这有意义吗?
严格来说,有更好的方法可以做到这一点,但这应该保持简单。 :)