我在接受采访时被问到这个问题我找不到解决方案,所以我想把它带给你们。 我们在接口i中有方法。只考虑方法1。因此,我们编写方法1的代码,并在所有三个A,B和B类中重复使用它。 C.我们对X,Y& Z.所以我想让不同的D类来定义method1并在其下面编写代码,但是D不能扩展到A,B& C因为它们延伸了X,Y和ž
有什么建议吗? 注意:如果我们使用的是专门的JDK 1.6
font-weight: bold
修改
无法更改namespace App\Models;
use Moloquent;
use Carbon\Carbon;
class Seat extends Moloquent
{
protected $collection = 'seat';
protected $connection = 'mongodb';
}
, interface i {
method1();
method2();
}
class A extends x
class B extends y
class c extends z`
和x
类。
答案 0 :(得分:1)
这没有错:
class A extends x implements i {
}
见:
Generic class that extends class and implements interface
<小时/> 另一方面,如果你真的想要A,B和C共享的代码(不仅仅是函数原型),那么X,Y和Z应该从类
Parent
扩展(X,Y和Z)必须从类Parent派生。
然后method1
可以在Parent
中定义,而不是在x,y和z中定义。
答案 1 :(得分:1)
问题不是100%明确,所以我将尝试回答这个并解释我的解释。如果解释错误,请告诉我,以便我指出正确的方向:
首先,您说所有课程都需要method1()
。假设还需要method2()
,则A
,B
和C
类需要implement
此接口。
您的代码将如下所示:
class A extends x implements i { ... }
class B extends y implements i { ... }
class C extends z implements i { ... }
如果在method1()
,A
和B
类中需要C
的相同实现,那么我建议使用抽象类,因此{{1看起来像是:
i
因为Java只允许一个超类abstract class i {
method1() {
// implementation here
}
abstract method2();
}
,x
和y
,所以需要扩展z
,从而使i
,{{ 1}}和A
看起来像:
B
修改强>
类C
,class A extends x
class B extends y
class C extends z
和x
需要如下所示:
y
如果method2()只需要一个实现,请执行以下操作:
z
编辑2:
在不编辑课程class x extends i {
// implement method2 here
}
class y extends i {
// implement method2 here
}
class z extends i {
// implement method2 here
}
,class i {
method1() {
// implement here
}
method2() {
// implement here
}
}
class x extends i {}
class y extends i {}
class z extends i {}
和x
的情况下,Stephen C发布了一个非常好的解决方案:
y
答案 2 :(得分:1)
如果没有要求共享代码:
public class A extends X implements I {
... // implement method1 here, or inherit it from X
}
如果您需要共享代码,有三种可能的方法:
将implements I
添加到相关类,并将X
等更改为extend
实现method1()
的基类; e.g。
public class A extends X implements I{ ...
public class X extends Q { ... }
public abstract class Q implements I { ... /* implement method1() */ }
使用委托; e.g。
public class A extends X implements I {
private I eye = // something that implements the I API
public void method1() {
eye.method1();
}
}
在Java 8及更高版本中,将method1()
的实现作为I
方法放入接口default
。此不会与Java 6 1 一起使用。
这些方法都不适用于所有情况。如果它们都不起作用(并且没有其他选择)那么您需要复制代码。
1 - 但另一方面,我会考虑为编码器工作,他们被困在Java 6上。这表明他们在管理事物的方式上有“问题”......可能会让Java开发人员的生活变得不愉快。 (无论如何,面试官为什么会说出这种限制。他们当然希望招募能够应对现代Java以及古代Java的人。)