Спадщина
Розгляньте автомобіль та автобус. Це два різні транспортні засоби. Але все-таки вони поділяють деякі загальні властивості, такі як у них рульове управління, гальма, передачі, двигун тощо.
Отже, з концепцією спадкування це можна представити наступним чином ...
public class Vehicle {
private Driver driver;
private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
//You can define as many properties as you want here ...
}
Тепер велосипед ...
public class Bicycle extends Vehicle {
//You define properties which are unique to bicycles here ...
private Pedal pedal;
}
І автомобіль ...
public class Car extends Vehicle {
private Engine engine;
private Door[] doors;
}
Це все про спадщину . Ми використовуємо їх для класифікації об'єктів на простіші базові форми та їх дітей, як ми бачили вище.
Анотація заняття
Абстрактні заняття - неповні об’єкти. Щоб зрозуміти це далі, давайте ще раз розглянемо аналогію транспортного засобу.
Можна керувати транспортним засобом. Правильно? Але різні транспортні засоби рухаються по-різному ... Наприклад, ви не можете керувати автомобілем так само, як за кермом велосипеда.
Тож як представити функцію приводу транспортного засобу? Складніше перевірити, що це за транспортний засіб, і керувати ним власною функцією; вам доведеться змінювати клас драйвера знову і знову, додаючи новий тип транспортного засобу.
Тут випливає роль абстрактних класів та методів. Ви можете визначити метод приводу як абстрактний, щоб сказати, що кожен успадковуваний дитина повинен реалізувати цю функцію.
Тож якщо ви модифікуєте клас автомобіля ...
//......Code of Vehicle Class
abstract public void drive();
//.....Code continues
На велосипеді та автомобілі також слід вказати, як керувати ним. В іншому випадку код не компілюється, і помилка видається.
Коротше кажучи .. абстрактний клас - це частково неповний клас з деякими неповними функціями, які діти, що успадковують, повинні вказати самостійно.
Інтерфейси
Інтерфейси абсолютно неповні. Вони не мають жодних властивостей. Вони просто вказують на те, що успадковані діти здатні щось робити ...
Припустимо, у вас з собою різні типи мобільних телефонів. Кожен з них має різні способи виконання різних функцій; Наприклад: дзвоніть людині. Виробник телефону вказує, як це зробити. Тут мобільні телефони можуть набрати номер - тобто це можливість набору номера. Представимо це як інтерфейс.
public interface Dialable {
public void dial(Number n);
}
Тут виробник Dialable визначає, як набрати номер. Вам просто потрібно дати йому номер для набору.
// Makers define how exactly dialable work inside.
Dialable PHONE1 = new Dialable() {
public void dial(Number n) {
//Do the phone1's own way to dial a number
}
}
Dialable PHONE2 = new Dialable() {
public void dial(Number n) {
//Do the phone2's own way to dial a number
}
}
//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE1;
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
Цим, використовуючи інтерфейси замість абстрактних класів, автору функції, яка використовує Діабел, не потрібно турбуватися про його властивості. Наприклад: чи є сенсорний екран або набір клавіатури, чи це стаціонарний стаціонарний телефон або мобільний телефон. Вам просто потрібно знати, чи можна це набрати; чи успадковує (або реалізує) інтерфейс Dialable.
І ще важливіше , якщо коли-небудь ви переключите Діабел на інший
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
Ви можете бути впевнені, що код все ще працює бездоганно, оскільки функція, яка використовує набирається, не залежить (і не може) залежати від деталей, відмінних від визначених в інтерфейсі Dialable. Вони обидва реалізують інтерфейс Dialable, і це єдине, що стосується функції.
Інтерфейси зазвичай використовуються розробниками для забезпечення сумісності (використання взаємозамінно) між об'єктами, наскільки вони поділяють загальну функцію (так само, як ви можете змінити на стаціонарний або мобільний телефон, наскільки вам просто потрібно набрати номер). Коротше кажучи, інтерфейси - це набагато простіша версія абстрактних класів, без будь-яких властивостей.
Також зауважте, що ви можете реалізувати (успадкувати) стільки інтерфейсів, скільки хочете, але ви можете розширити (успадкувати) лише один батьківський клас.
Детальніше
Абстрактні класи проти інтерфейсів