назначение интерфейса в классах

какова цель интерфейса при написании класса?

вот пример, который я видел в Интернете.

<?php
interface Chargeable {
    public function getPrice();
}

class Employee implements Chargeable {
    protected $price;

    public function getPrice() {
        return $this->price;
    }
}

$product = new Employee();

?>

Ответов (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 
....
}

так что класс интерфейса - это общая концепция.