【发布时间】:2017-03-06 12:07:17
【问题描述】:
例如,我有动物类和扩展动物的类猫(鸟、狗、鱼...)。现在我想声明类 Pet,它也是 Animal,我希望它是从任何现有的 Animal 构建的,例如猫。
所以我需要这样的构造函数:
class Pet extends Animal{
private String nickname;
private Animal kind;
Pet(Animal a, String nickname){
<...>;
this.nickname = nickname;
}
}
编辑: 我想要这样的东西:
Cat cat = new Cat();
Animal pet = new Pet(cat, "Foo");
if (pet instanceof Pet){
if (pet.kind instanceof Cat){
Pet.sayMeow();
}
}
这是否意味着我只需要 <...> 中的Animal()(受保护的)构造函数?
【问题讨论】:
-
问问自己:
Pet应该如何处理传递的Animal?您目前对此无能为力,这就是为什么这个问题不清楚(不清楚您通过Animal的原因是什么)。 -
@Tom 所说的:有关您要实现的目标的更多信息会很好。目前,这听起来像是您可以使用
interface的东西。 -
如果您说您想获取
Animal的现有实例并将该实例 转换为Pet追溯,您不能这样做。您可以创建一个从Animal实例初始化的新Pet,但它将是独立的。实例的类在创建时被锁定。 (我们可以对那个实例有不同的[接口]视图,一些代码可能只知道它是Animal,而其他代码可能知道它是Cat,但是instance有一个特定的类集当它被创建时。) -
闻起来有点像decorator。从代码中,我猜您只是想将“昵称”属性添加到任何
Animal。对吗? -
我刚刚在您的编辑中看到的内容:您为什么要在
Animal类中拥有一个Animal成员?更一般地说,kind到底应该是/做什么?你看,你是在说“我想要这样的东西”,但我们很难说为什么你想要那个。