这个问题在求职面试,Java开发,学生职位时被问到。
interface SomeInterface {
public void execute();
}
class A implements SomeInterface {
public void execute() {...}
}
问题是:
新开发人员被要求创建一个扩展A类的类,并创建名为Execute
的方法,这个方法会做一些事情。我们应该如何重写上面的代码,以便在调用方法Execute
时获得输出“启动过程”
(当然不应该在B类中进行打印)。
class B extends A {
public void execute() {
//some code goes here
}
}
我知道它可以用两个函数完成,其中一个是抽象的。 请指教......
答案 0 :(得分:10)
这是template pattern的一个例子。抽象超类A通过执行“标准”部分(在这种情况下打印某些内容)将结构强加到处理中,然后调用子类的具体实现来进行实际/特定处理:
abstract class A implements someIterface {
public void Execute() {
System.out.println("start process"):
doExecute();
}
protected abstract void doExecute();
}
class B extends A {
protected void doExecute() {
// some code goes here
}
}
更常见的是:
execute
而不是Execute
SomeInterface
而不是someInterface
execute
答案 1 :(得分:2)
super调用父类的功能。
public class Test
{
public static void main(String[] args)
{
B b = new B();
b.execute();
}
}
interface Foo
{
public void execute();
}
class A implements Foo
{
public void execute()
{
System.out.println("from class A");
}
}
class B extends A
{
public void execute()
{
super.execute();
System.out.println("from class B");
}
}
此代码的输出是
from class A
from class B
答案 2 :(得分:0)
赦免。
我主要是一名.NET开发人员,所以不要对我过于严格,但我实际上在C#
尝试了一个小节,并做了类似的事情:
我们输入数据
interface SomeInterface
{
void execute();
}
public class A : SomeInterface
{
public void execute() {
Console.WriteLine("Start process");
}
}
public class B : A {
public void execute() {
Console.WriteLine("Execute B");
}
}
事情是(并且 也应该在Java
中工作),如果我编写代码,就像这样:
SomeInterface inter = new B();
inter.execute();
它将按要求打印并预期“启动过程”,因为inter.exexute
将调用它的已实现版本(因此存在于A
中),即使实际类型为{{ 1}}。
希望这有帮助。