Как переопределить метод в Java, но все еще иметь частичную функциональность родительского метода - PullRequest
8 голосов
/ 30 января 2012

Этот вопрос был задан во время собеседования, разработки Java, позиции студента.

interface SomeInterface {
    public void execute();
}

class A implements SomeInterface {
    public void execute() {...}   
}

Вопрос:

Новому разработчику было предложено создать класс, который расширяет класс A, и создать метод с именем Execute, этот метод будет делать некоторые вещи. Как мы должны переписать приведенный выше код, чтобы получить вывод «start process» при вызове метода Execute (конечно, печать не должна выполняться в классе B).

class B extends A {
   public void execute() {
      //some code goes here 
   }
}

Я знаю, что это можно сделать с помощью двух функций, одна из которых абстрактная. Пожалуйста, посоветуйте ...

Ответы [ 3 ]

10 голосов
/ 30 января 2012

Это пример шаблона шаблона .Абстрактный суперкласс 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
2 голосов
/ 04 февраля 2012

супер вызывает функциональность из вашего родительского класса.

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
0 голосов
/ 31 января 2012

Простите.

Я в основном разработчик .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), даже если фактический тип B.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...