Interfejsy w C++

Opublikowane: 18/04/2015

w kategorii Zasoby.

Wstęp

Interfejsy pozwalają na deklarację wymaganych elementów (metod) dla klas bez ich implementacji. W Javie jest do tego specjalny element języka, w C++ można użyć klas abstrakcyjnych. Dodatkowo, w Windows, interfejsy są częścią funkcjonalności COM/DCOM (koncepcja niezależna od języka - zobacz __interface).

Prosty przykład

Najprostszą metodą implementacji interfejsów w C++ jest użycie abstrakcyjnej klasy jak poniżej:

class NamedIntf 
{
public:
  /// zwraca nazwę obiektu
  virtual string getName() = 0;
  // wymagane w celu ochrony przed wyciekiem pamięci
  virtual ~NamedIntf() { }
};

class ProductIntf
{
public:
  /// zwraca cenę w walucie bazowej
  virtual int getPrice() = 0;
  // wymagane w celu ochrony przed wyciekiem pamięci
  virtual ~ProductIntf() { }
};

class Car: public ProductIntf, public NamedIntf {
  virtual int getPrice() { return 20000; }
  virtual string getName() { return "Samochód"; }
};

class Dog: public NamedIntf {
  virtual string getName() { return "Pies"; }
};

void showObjectName(const NamedIntf &named) {
  cout << "Nazwa obiektu = [" << named.getName() << "]" << endl; 
}

Car car;
Dog dog;

showObjectName(car);
showObjectName(dog);

Jak sprawdzić czy obiekt implementuje dany interfejs?

Możesz użyć dynamic_cast lub wrappera:

template < class TypeTo, class TypeFrom >
TypeTo *interface_cast(TypeFrom *t) {
    TypeTo *res = dynamic_cast<TypeTo *>(t);
    return res;
}

template < class TypeTo, class TypeFrom >
bool implements_interface(TypeFrom *t) {
  return (interface_cast<TypeTo>(t) != nullptr);
}

unique_ptr<Dog> dog(new Dog());
cout << "twój pies ma imie? " << (implements_interface<NamedIntf>(dog.get())?"tak":"nie") << endl;

Poradniki

Inne rozwiązania

Zobacz także

Udostępnij

obserwuj