具有继承性的对象的C#数组
我在从子类获取值时遇到问题具有继承性的对象的C#数组,c#,object,inheritance,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
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的值?
可能吗?
很抱歉,我是新手。欢迎来到StackOverflow,以及整个奇妙的发展世界。不幸的是,从风格的角度来看,这段代码有很多问题,所以如果你不介意的话,我会在回答你的实际问题的同时,加入一些想法 1)无论在什么平台上工作,都要尽量遵循标准样式惯例。对于.NET,这意味着在命名类或方法时使用PascalCasing 2)在进行面向对象编程时,务必尝试按照对象所代表的系统实体对对象进行建模。在您的情况下,您已经声明
Cat
和Dog
为PetStore
的子类。这是另一种说法,狗是宠物店的一种。这没有任何意义。据我所知,没有一条狗能为人们穿过的动物提供一排排的笼子和宠物
更合适的做法是将您的超类称为Pet
public class Dog : Pet {}
3)最后,我相信这就是你实际问题的答案,你想做的就是选角。这意味着您正在获取一个对象,该对象可能包含在一个更通用的类型中,并尝试将其移动到一个更特定的类型中,以便您可以利用可能仅存在于该特定子类上的方法和属性。在这种情况下,这是狗型
和猫型
。它还要求您知道要强制转换的实例属于要将其强制转换到的特定类型
// 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");
我们知道,在这种情况下,数组的第一个元素是狗
,第二个元素是猫
。因为我知道这一点,我可以将这些宠物的实例转换为它们的特定类型
// 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);
看起来我们可能需要后退一步,确保我们知道你想要做什么 我的印象是,你的项目目标是要有一个宠物店,有不同的宠物 我猜你会想保持这个简单,所以记住这一点;从上面的陈述中,我们可以评估如下:
猫是宠物
狗是宠物
宠物店有很多宠物-这部分可能会很奇怪,但我们现在将保持简单,并使用你展示的阵列 因为猫和狗是宠物,所以创建一个名为宠物的基类
现在制作宠物儿童的狗和猫课程
现在让宠物商店成为一个宠物阵列,并添加你的宠物(狗和/或猫) 这有意义吗
严格地说,有更好的方法可以做到这一点,但这应该保持简单 这些代码都没有任何意义。
petstore
类有一个名为kennel
的构造函数,它不会编译。狗不是一种宠物店,那么为什么类dog
扩展petstore
?我想您应该将petstore
类重命名为Pet
。第一点:请开始遵循.NET命名约定。这将使你更容易效仿你的榜样,因为潜意识不会一直在尖叫“啊”…首先,你需要将狗型
和猫型
公开。或者更好的做法是为它们创建公共属性,而不是将字段公开。那么你只需要投给孩子类型的球就可以了。@juharr非常感谢你!
// 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);