назначение интерфейса в классах
какова цель интерфейса при написании класса?
вот пример, который я видел в Интернете.
<?php
interface Chargeable {
public function getPrice();
}
class Employee implements Chargeable {
protected $price;
public function getPrice() {
return $this->price;
}
}
$product = new Employee();
?>
Ответов (7)7
Во-первых, структуры интерфейсов предоставляют интерфейс классам, реализованным для связи с внешним миром. Простой пример - телевизор. Телевидение - это класс, а кнопки на нем - интерфейсы.
Совет по использованию интерфейсов:
1-Java не поддерживает множественное наследование. Если мы хотим добавить два разных метода из разных классов, мы не можем (расширить ClassA, ClassB) невозможно, реализует A, B без проблем.
2-Другой совет - безопасность и гибкость. Можно привести более конкретный пример, если мы хотим, чтобы некоторые методы класса были недоступны, как мы можем это сделать? полиморфизм + интерфейс, мы можем это сделать, если мы не хотим, чтобы методы walk и bark были недоступны
abstract class Animal {
String name;
int age;
public Animal(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
class Dog extends Animal implements Run {
public Dog(String name, int age) {
super(name, age);
// TODO Auto-generated constructor stub
}
@Override
public void run() {
// TODO Auto-generated method stub
}
public void bark() {
}
}
class Cat extends Animal implements Climb {
public Cat(String name, int age) {
super(name, age);
}
@Override
public void climb() {
// TODO Auto-generated method stub
}
public void walk() {
}
}
public class Main {
public static void main(String[] args) {
// if we want that some of methods of the class are not reachable how
// can we do that?
// polymorphism + interface we can do that
// for example if we do not want walk and bark methods should be
// unreachable
Climb cat = new Cat("boncuk", 5);
Run dog = new Dog("karabas", 7);
// see we cannot reach the method walk() or bark()
dog.walk(); // will give an error. since there is no such a method in the interface.
}
}}
enter code here
Вот один из способов, как я узнал об интерфейсах и понял их.
Представьте себе такой сценарий:
abstract class Plane {
public function openDoors();
}
interface Fliers {
public function fly();
}
Теперь давайте воспользуемся ими:
class Boeing747 extends Plane implements Fliers {
public function fly() {
// some stuff
}
public function openDoors() {
// do something
}
}
А также:
class Tweety implements Fliers{
public function fly() {
// some stuff
}
}
Boeing747 - это самолет, который может летать, а Твити - птица, которая не умеет летать, но Твити не имеет смысла «открывать двери».
Дело в том, что интерфейсы могут быть реализованы с помощью различных типов объектов, а классы - нет. Как видите, у Boeing747 и Tweety нет ничего общего, кроме того, что оба умеют летать.
Интерфейс - это концепция объектно-ориентированного программирования, которая допускает полиморфизм. По сути, интерфейс похож на контракт, с помощью которого классы, реализующие его, соглашаются предоставить определенные функции, чтобы их можно было использовать так же, как другие классы, использующие интерфейс.
В вашем примере показаны классы, которые гарантируют, что у них есть метод getPrice. Затем вы можете написать код, который использует преимущества объектов, имеющих этот метод, не беспокоясь о том, что это за класс.
Интерфейсы позволяют отделить интерфейс от реализации. Это удобно, когда вы, помимо прочего, хотите добиться ортогональности в коде.
По сути, вы сможете создавать функции, которые принимают Chargeable
и могут передавать туда любой объект, если он реализует Chargeable
. Это позволяет вам быть гибкими в будущем, если вам нужно сменить Employee
класс. Также это позволяет вашему методу принимать любой объект, который является «платным».
В языках с множественным наследованием вместо интерфейсов у вас есть абстрактные классы. В PHP нет множественного наследования, поэтому у вас есть интерфейсы. Один класс может реализовывать различные интерфейсы. Единственное, что нужно сделать - это гарантировать, что ваш класс имеет определенный набор методов.
Я сейчас изо всех сил пытаюсь понять это (и я думаю, что читаю ту же книгу, что и OP ...).
Мне кажется, что интерфейсы просто навязывают «договорные» обязательства по классам, которые реализуют интерфейс для реализации функций / свойств, которые появляются в интерфейсе. Тем не менее, разве классы / объекты, реализующие интерфейс, не могут делать это уникальным образом, поскольку реализация не определена?
Здесь нет фактического наследования?
позвольте мне привести вам пример, чтобы понять размер этого типа классов
public interface transport{
public double getSpeed(){return(0/*the speed*/);}
public void setSpeed(){return(0/*the speed*/);}
}
class car extend transport{
//implementation of transport interface
public double getSpeed(){return(speed/*the speed*/);}
public void setSpeed(){speed=250;}
}
class train extend transport{
//implementation of transport interface
....
}
class plane extend transport{
//implementation of transport interface
....
}
так что класс интерфейса - это общая концепция.