我在Java中有一个问题,可能与多重继承有关。
沃克是一个可以走路和繁殖的人, 讲话者是一个可以交谈和繁殖的人, 游泳者是一个可以游泳,聊天,散步和繁殖的人。
用Java建模它们的最佳方法是什么?
感谢您的回答, 特茹
答案 0 :(得分:2)
您应该将行为提取到接口中,而不是单独的类。
interface Swimmable{
void swim();
}
interface Talkable{
void talk();
}
interface Walkable{
void walk();
}
class Person {
void breed();
}
注意我是如何将它们命名为 Walkable 而不是 Walker 。这表明此接口定义了一个行为,并不是一个独立的东西。现在你的实际对象可以被称为 Walker ,但是如果你将它用于其他想要这种行为的类,那么词法上的 walkable 也会更有意义。
有很多关于“组合超过继承”的炒作,但实际上这对于使用这两个可互换的程序员来说是不合适的解决方案。
现在,如果你想创建一个可以游泳和走路的实体,你可以简单地定义它:
class Athlete extends Person implements Swimmable, Walkable {
@Override
void swim(){ }
@Override
void walk(){ }
}
并且不会混淆必须通过实际Athlete
类等中的另一层调用的行为的实际实例。
答案 1 :(得分:1)
Walker是一个可以走路和繁殖的人,一个说话者是一个可以说话和繁殖的人。游泳者是一个可以游泳,说话,散步和繁殖的人。
我会使用接口来表示 traits ,并使用具体的类来表示 types ,例如:
public interface IWalker {
public void walk ();
}
public interface IBreeder {
public void breed ();
}
public interface ITalker {
public void talk ();
}
public interface ISwimmer {
public void swim ();
}
public class Person {
}
public class Walker extends Person implements IWalker, IBreeder {
@Override public void walk () { ... }
@Override public void breed () { ... }
}
public class Talker extends Person implements ITalker, IBreeder {
@Override public void talk () { ... }
@Override public void breed () { ... }
}
public class Swimmer extends Person implements ISwimmer, ITalker, IWalker, IBreeder {
@Override public void swim () { ... }
@Override public void walk () { ... }
@Override public void talk () { ... }
@Override public void breed () { ... }
}
通过这种方式,您可以使用IWalker
在任何可以行走的任何预期的地方,或Swimmer
任何特定类型的人预期的地方,或Person
1}}预期一般人的任何地方。
为了记录,我不特别喜欢接口的I*
命名方案;但鉴于选择这个词,我选择它们是独一无二的。
答案 2 :(得分:1)
我认为接口是持有实体所拥有的ablity
的东西,这可能就是为什么在JavaSE中许多接口都是名称XXXable,其中XXX表示能力,例如Comparable
,'Serializable'等。< / p>
在这里,Breeading,Talking,Walking,Swimming是某些人的能力。所以一个实体有一定的能力。因此,我将所有这些独立的能力作为接口和实体(Swimmer, Talker, Walker
)将实现这些接口以获得这些能力。
interface Breedable {
public void breed();
}
interface Walkable {
public void walk();
}
interface Talkable {
public void talk();
}
interface Swimmable {
public void swim();
}
class Swimmer implements Swimmable, Walkable, Talkable, Breedable {
@Override
public void breed() {
// TODO Auto-generated method stub
}
@Override
public void talk() {
// TODO Auto-generated method stub
}
@Override
public void swim() {
// TODO Auto-generated method stub
}
@Override
public void walk() {
// TODO Auto-generated method stub
}
答案 3 :(得分:-1)
我认为你应该拥有的就是那样。
public class Person
//Breed method here
public class Walker extends Person
//Walk method here
public class Talker extends Person
//Talk method here
public class Swimmer extends Person
//Swim, talk & walk method here
但你应该做的是考虑分离关注点。每个对象之间是否有足够的共同点来使用继承?也许不吧。
答案 4 :(得分:-1)
class person{
//breed function
}
class walker extends person{
//walk function
}
class talker extends person{
//talk function
}
class swimmer extends talker{
//swim function
//walk function
}