2015-06-24 4 views
3

Я хотел бы сделать SubClasses до @Override методом от SuperClass.Принудительные подклассы к методу @Override от SuperClass. Метод в SuperClass должен иметь тело

Метод в SuperClass не может быть abstract, потому что я хочу предоставить некоторую базовую реализацию.

Вот пример моего кода:

public abstract class GenericModel<T extends GenericModel> { 
    long id, counter; 

    public String methodToBeOverridenInSubClass(String name) { 
     // some basic implementation 
     // rest details will be provided by subclass 
     return name; 
    } 

} 
public class SubClass extends GenericModel<SubClass> { 
    @Override 
    public String methodToBeOverridenInSubClass(String name) { 
     switch (name) { 
      case "name": return "Real name"; 
      default: super.methodToBeOverridenInSubClass(name); 
     } 
    } 
} 

Это сообщение интересно: MustOverrideException and MethodNotOverridenException

Пожалуйста, дайте мне некоторую помощь

+0

Вы не можете заставить подкласс переопределить, если метод суперкласса не является абстрактным. –

+0

Я знаю это. Я ищу обходное решение – masterdany88

ответ

2

Возможно, что вы ищете, разрешается Template method pattern. В котором вы создаете родительский класс с одним реализованным методом, который описывает процесс, который вызывает другие методы (шаги). Эти шаги являются абстрактными, поэтому они реализуются подклассом.

Пример из Википедии:

/** 
* An abstract class that is common to several games in 
* which players play against the others, but only one is 
* playing at a given time. 
*/ 

abstract class Game { 

protected int playersCount; 
abstract void initializeGame(); 
abstract void makePlay(int player); 
abstract boolean endOfGame(); 
abstract void printWinner(); 

/* A template method : */ 
public final void playOneGame(int playersCount) { 
    this.playersCount = playersCount; 
    initializeGame(); 
    int j = 0; 
    while (!endOfGame()) { 
     makePlay(j); 
     j = (j + 1) % playersCount; 
    } 
    printWinner(); 
} 
} 

//Now we can extend this class in order 
//to implement actual games: 

class Monopoly extends Game { 

/* Implementation of necessary concrete methods */ 
void initializeGame() { 
    // Initialize players 
    // Initialize money 
} 
void makePlay(int player) { 
    // Process one turn of player 
} 
boolean endOfGame() { 
    // Return true if game is over 
    // according to Monopoly rules 
} 
void printWinner() { 
    // Display who won 
} 
/* Specific declarations for the Monopoly game. */ 

// ... 
} 

class Chess extends Game { 

/* Implementation of necessary concrete methods */ 
void initializeGame() { 
    // Initialize players 
    // Put the pieces on the board 
} 
void makePlay(int player) { 
    // Process a turn for the player 
} 
boolean endOfGame() { 
    // Return true if in Checkmate or 
    // Stalemate has been reached 
} 
void printWinner() { 
    // Display the winning player 
} 
/* Specific declarations for the chess game. */ 

// ... 
} 
+0

Это не правильный ответ на вопрос. Подкласс должен быть вынужден реализовать один из методов суперкласса, который имеет тело. – tainy

2

Вы можете использовать два метода:

public abstract String methodToBeOverridenInSubClass(String name); 


protected String commonMethodToUseInSubClasses(String name) { 
    // some basic implementation 
    return name; 
} 

Таким образом, подкласс должен переопределить methodToBeOverridenInSubClass, но вы все равно можете использовать общий код для всех подклассов в commonMethodToUseInSubClasses.

+0

Итак, в 'SubClass' я переопределю' методToBeOverridenInSubClass'. Тогда в этом теле метода я вызову 'methodToUse' из' SuperClass'? – masterdany88

+0

Да. Общий код может быть помещен в суперкласс – BobTheBuilder

+1

Вы дали мне хороший ответ, который решает мою проблему. Так что спасибо. Но [Ezequiel] (https://stackoverflow.com/users/2547753/ezequiel) [ответ] (http://stackoverflow.com/a/31020440/2794446) более подробно. Поэтому я обязан принять его ответ. – masterdany88

 Смежные вопросы

  • Нет связанных вопросов^_^