Интерфейс Java в С++

сначала отправляйте так, пожалуйста, будьте осторожны!

У меня есть интерфейс, похожий на этот

public interface I_Hospital{
 public void registerObserver(I_Person p);
 public void removeObserver(I_Person p);
 public void notifyObservers();
 public void addWard(Ward ward);
}

Теперь, если я хочу воссоздать это в C++, правильно ли сделать следующее:

IHospital.h

Class IHospital{
 public:
 virtual void registerObserver(IPerson p) = 0;
 etc...
}

Является ли это правильной реализацией интерфейса в C++?

Спасибо, Патрик

3 ответа

Да, вы бы определили интерфейс как абстрактный класс, содержащий чистые виртуальные функции (с чистотой, обозначенной = 0), точно так же. Как и интерфейсы Java, абстрактные классы не могут быть созданы непосредственно, но должны быть получены из конкретных классов, которые переопределяют и реализуют чистые виртуальные функции.

Есть несколько вопросов:

  • ключевое слово для введения класса - class not Class
  • вы захотите взять параметр IPerson по ссылке, IPerson &, а не по значению; абстрактные классы не могут быть переданы по значению. То же самое относится к аргументу Ward; даже если он не абстрактный, вы, вероятно, хотите, чтобы этот класс ссылался на опекун (как на версию Java), а не на копирование. В отличие от Java, передача объекта класса в функцию передаст копию объекта, если только вы специально не просите передать его по ссылке.


Да, это как можно ближе к концепции интерфейсов Java.

Обратите внимание, что C++ фактически не имеет понятия интерфейса как отдельной вещи из класса. Тем не менее, для разработчиков C++ принято ссылаться на классы, у которых нет элементов данных и чьи методы являются чисто виртуальными в качестве интерфейсов - это различие, сделанное программистами, а не самим языком.


Интерфейс Java предоставляет методы, которые должны быть переопределены классами, которые наследуются от этого интерфейса. Это похоже на наличие абстрактного C++ базового класса, который использует чистые виртуальные методы, как тот, который вы показали. Так что да, это правильная реализация. Также обратите внимание, что в базовых классах должны быть виртуальные деструкторы, так что удаление указателя базового класса на производный экземпляр правильно вызывает деструкторы производных и базовых классов.

licensed under cc by-sa 3.0 with attribution.