Создание экземпляра класса, расширяющего абстрактный класс, реализующий интерфейс

#java #inheritance #abstract-class

#java #наследование #абстрактный класс

Вопрос:

Итак, у меня есть этот класс с именем COL, который содержит следующую функцию:

 public class CatalogueOfLife extends EDITPlatform {

private static final String nomatchfound = "there is nothing";

protected String getNoResultsMessage(){
      return COL.nomatchfound;
}
 

А затем интерфейс с именем interface, который имеет эту функцию:

 public interface WSInterface {

public boolean matchfound(String noMatchString);
}
 

Наконец, абстрактный класс с именем platform, который использует обе функции следующим образом:

 public abstract class EDITPlatform implements WSInterface{

public boolean matchfound(String noMatchString){
   if (noMatchString.contains(getNoResultMessage())){
        return true;
   }
   return false; }
 

Теперь я хотел бы вызвать matchfound функцию из основной функции. Я могу использовать только объект COL, но проблема в том, что мне нужно иметь больше, чем один класс, чтобы расширить платформу.

Комментарии:

1. На самом деле, я не понимаю, в чем проблема… Почему вы можете использовать только COL объект? Зачем вам нужно иметь несколько расширенных классов Platform ? Вы хотите сделать что-то вроде COL col = new Platform(); then be able to do col.matchfound(aString) ?

2. Потому что у меня на самом деле будут другие классы, отличные от COL, которые расширят абстрактный класс. так, например, у меня будет WAP и COL оба расширения platform .. и каждый из них отправит nomatchfound в функцию другую platform строку.. Мне нужно вызвать функцию с платформы в основном, без необходимости явно указывать, какой подкласс ее вызвал.

3. Я серьезно сомневаюсь, что ваш интерфейс вызывается interface так, как вы говорите, потому что это зарезервированное ключевое слово Java. Пожалуйста, опубликуйте реальные объявления классов и интерфейсов, а не описывайте их на английском языке; это также расскажет нам, как выглядит ваша иерархия классов.

4. интерфейс называется «WSInterface».. Иерархия следующая: COL extends platform // platform implements interface

5. Не могли бы вы добавить main с проблемой? Я не вижу проблемы, поэтому, думаю, я не понял вашего вопроса. Если WAP и COL расширяют платформу, у вас может быть коллекция объектов платформы и вызвать obj.matchFound(ввод)… что-то вроде Platform[] platforms= {new WAP(),new COL()}; для каждого (платформа: платформы){platform.matchFound(«некоторая строка»)}

Ответ №1:

Обновлено: ваша проблема в том, что EDITPlatform у него нет getNoResultMessage() метода. Поэтому вы не можете его вызвать.

если вам нужно определить этот метод внутри CatalogueOfLife , вам следует использовать абстрактный метод:

 public abstract class EDITPlatform implements WSInterface{

    protected abstract String getNoResultMessage();

    public boolean matchfound(String noMatchString){
        if (noMatchString.contains(getNoResultMessage())){
            return true;
        }
        return false; 
    }
}
 

А затем переопределите его в классе solid

 public class CatalogueOfLife extends EDITPlatform {

    private static final String nomatchfound = "there is nothing";

    @Override
    protected String getNoResultsMessage(){
        return CatalogueOfLife.nomatchfound;
    }
}
 

Наконец

 CatalogueOfLife col = new CatalogueOfLife();
boolean matched = col.matchFound(myString);
 

Комментарии:

1. На самом деле, это COL, который является подклассом Platform!

2. почему вы не публикуете объявления своих классов и интерфейсов

Ответ №2:

Если COL является подклассом Platform, то в коде

 if (noMatchString.contains(getNoResultsMessage()))
 

getNoResultsMessage() недоступен в платформе.

И поскольку вы внедрили все методы интерфейса Platform , это не обязательно abstract

Это то, что вы ищете:

 class CatalogueOfLife // extends EDITPlatform
{
    private static final String nomatchfound = "there is nothing";

    protected String getNoResultsMessage() {
        return CatalogueOfLife.nomatchfound;
    }
}

interface WSInterface {
    public boolean matchfound(String noMatchString);
}

class EDITPlatform extends CatalogueOfLife implements WSInterface {
    public boolean matchfound(String noMatchString) {
        if (noMatchString.contains(getNoResultsMessage()))
            return true;
        return false;
    }
}

public class MainClass {

    public static void main(String[] args) {
        EDITPlatform plat = new EDITPlatform();
        System.out.println(plat.getNoResultsMessage());
        System.out.println(plat.matchfound("there is nothing"));
    }

}