Каков наилучший способ доступа к методу в абстрактном классе, когда интерфейс не имеет его? - PullRequest
0 голосов
/ 03 июня 2019

Исходя из существующей архитектуры, написанной кем-то, мне нужно расширить мою реализацию.Позвольте мне объяснить пример кода:

interface Configuration{
   public String getPID();
   public void display(); 
}

public abstract class BaseConfiguration implements Configuration {
     @Override
     public String getPID(){
          //some code here
     }
     @Override
     public void display(){
          //some code here
     }

     abstract public <T> T clone(Dictionary<String, Object> properties, 
      Class<T> clazz);
}


public class XMLConfiguration extends BaseConfiguration{
    public <T> T clone(Dictionary<String, Object> properties, 
      Class<T> clazz){
      // implementation  
     }
}

public class ConfigurationAdmin
{
     public static Configuration getCondfiguration(){
        return new XMLConfiguration();
     }
}

Я могу понять, что невозможно вызвать метод clone из интерфейса.

Configuration conf = ConfigurationAdmin.getConfiguration();
conf.clone(someDictionary, Foo.class) // Gives compilation error

Каков наилучший способвызвать метод клонирования?

Ответы [ 3 ]

4 голосов
/ 03 июня 2019

Вы можете вызвать его после приведения к BaseConfiguration, если экземпляр объекта проходит проверку instanceof:

if (o instanceof BaseConfiguration) {
  ((BaseConfiguration) o).clone(someDictionary, Foo.class);
} else {
   throw new AssertionError("Does not extend BaseConfiguration");
}
1 голос
/ 03 июня 2019

Если все конфигурации должны быть клонируемыми, просто добавьте их в Configuration.

Если не все - сделайте что-то вроде

interface CloneableConfiguration extends Configuration {
    public <T> T clone(Dictionary<String, Object> properties, Class<T> clazz);
}

затем

public class XMLConfiguration extends BaseConfiguration implements CloneableConfiguration {
    ...
}

Но никогда не используйте конкретные реализации в своих высказываниях.

0 голосов
/ 03 июня 2019

В ролях ваш Configuration объект.Используйте instanceof проверку безопасности, так как API не в ваших руках

Configuration conf = ConfigurationAdmin.getConfiguration();
if(conf instanceof BaseConfiguration) {
    BaseConfiguration base = (BaseConfiguration) conf;
    base.clone();
}
else {
    // throw an exception of log an error
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...