Інтерфейси в java

Код 1:

public class User1 implements MyInterface
{
    @Override
    public void doCalculation() { }
}

public class User2 implements MyInterface
{
    @Override
    public void doCalculation() { }
}

interface MyInterface
{
    public void doCalculation();
}

Код 2:

public class User1
{
    public void doCalculation() { }
}

public class User2
{
    public void doCalculation() { }
}

У моєму коді 1 у мене є MyInterface , в якому є порожній метод doCalculation() . Цей doCalculation() використовується користувачем 1 і user2, реалізуючи MyInterface .

Де, як у моєму Код 2 , я маю два різних класу з визначеним методом doCalculation() .

У обох випадках code1 і code2 я сам повинен написати реалізацію. Мій метод doCalculation() - це просто порожній метод.

Отже, що таке використання MyInterface тут?

  1. Він лише надає мені назву методу або скелет (чи є це єдиною перевагою інтерфейсу)?

  2. Або ще я буду зберігати будь-яку пам'ять при використанні MyInterface ?

  3. Це, це лише пустий метод для класу, який його реалізує, то чому б я не визначив його сам, як це зробив у моєму code2.

  4. Більше того, є користь від використання інтерфейсу.

3
@ Джон-Віллемс: я не знаю. Чомусь мені подобається "Claculation". Це має певне кільце. До оригінального плаката знайдіть книгу "Шаблони дизайну", і тоді ви краще побачите і зрозумієте красу і силу інтерфейсів. Це дозволяє "підключити" ін'єкційний код, а також маскутим і тестувальним кодом.
додано Автор Hovercraft Full Of Eels, джерело
можливий дублікат Якщо ви завжди будете кодувати інтерфейси в Java та багато інших інтерфейсних питань.
додано Автор Hovercraft Full Of Eels, джерело
Відвідайте це посилання stackoverflow.com/questions/6533147/…
додано Автор Gaurav Manral, джерело
Привіт, я редагував ваш пост, але у вас неправильно написано doCalculation() багато як doClaculation() . Ви можете це виправити? Я не хочу змінювати ваш код синтаксично.
додано Автор John Willemse, джерело
О, Спасибі, я думаю, що я вчуся дуже повільно ..... але продовжувати вчитися спасибі за вашу відповідь .....
додано Автор Ravi Chandran, джерело

9 Відповіді

Інтерфейси використовуються дуже багато, тому що вони в основному є проектом того, що ваш клас повинен мати можливість робити.

Наприклад, якщо ви пишете відеоігри з символами, ви можете мати інтерфейс, у якому зберігаються всі методи, які повинен мати персонаж.

Наприклад

public interface Character {
    public void doAction();
}

And you have 2 characters, Наприклад an ally and an enemy.

public class Ally implements Character {
    public void doAction() {
        System.out.println("Defend");
    }
}

public class Enemy implements Character {
    public void doAction() {
        System.out.println("Attack");
    }
}

Як видно, обидва класу реалізують інтерфейс, але вони мають різні дії. Тепер ви можете створити персонаж, який реалізує ваш інтерфейс і виконує його. Залежно від того, чи це ворог чи союзник, він буде виконувати іншу дію.

public Character ally = new Ally();
public Character enemy = new Enemy();

І у вашій основній програмі ви можете створити метод, який приймає будь-який об'єкт, який реалізує ваш інтерфейс, і чи повинен він виконувати його, не знаючи, який саме такий символ.

void characterDoAction(Character char) {
    char.doAction();
}

Якщо б ви надали союзник цьому методу, вихід буде:

Defend

Якщо б ви надав ворога цьому методу, вихід був би:

Attack

Я сподіваюсь, що це був досить гарний приклад, який допоможе вам зрозуміти переваги використання інтерфейсів.

3
додано

Існує багато переваг програмного забезпечення, керованого інтерфейсом.

Що означає "програма для взаємодії, а не реалізація"?

В основному ви визначаєте контракт в інтерфейсі, і всі класи, які реалізують інтерфейс, повинні дотримуватися контракту.

Відповіді на ваші запитання:

1.Я тільки надає мені ім'я методу або скелет (це те, що єдина перевага інтерфейсу)?

--> Its not just about providing the method name but also defining what the class implementing the interface can do.

2.Або ще я буду зберігати будь-яку пам'ять під час використання MyInterface?

--> Nothing to do with the memory

  1. Is that, it only provides the empty method for an class which implements it, then why not I define it by myself as I have done in my code2. --> see the advantages of interface driven programming.

4.More than that is there any more advantage on using an interface. --> Plenty,specially dependency injection , mocking , unit testing etc.

2
додано
sidshu, будь ласка, виправте мене, якщо я помиляюся ... ваша відповідь на перше запитання <�Це не просто надання назви методу, а й визначення того, що {{клас реалізації інтерфейсу може зробити}}>. що може виконувати пустий спосіб, коли я реалізую інтерфейс, що ви скажете, просто базується на назві методу (прикметника), а не його реалізації.
додано Автор Ravi Chandran, джерело
(наприклад, просто дивлячись на назву інтерфейсу або метод у інтерфейсі, ми можемо зробити висновок про те, що цей інтерфейс навмисне для деякої діяльності)
додано Автор Ravi Chandran, джерело
Я погоджуюсь з вашим коментарем, якщо я використовую інтерфейс для цього, це тільки марнотратство його реалізації ........ але чи можна додати більше подробиць, яке місце вдається, і де я можу його використовувати .....
додано Автор Ravi Chandran, джерело
@RaviChandran Я розумію, що ви маєте на увазі, і ви можете застосувати інтерфейс і визначити порожній метод або метод, повертаючи нуль, але тоді буде поганою практикою слідувати. Так, наприклад якщо у вас є інтерфейс Bird за допомогою методу fly (), ви створюєте восьмоподібний клас реалізації і створюєте пустий метод реалізації. Код може бути синтаксично правильним, але він не буде мати сенсу, отже, погана практика.
додано Автор sidshu, джерело

Дуже хороше пояснення можна знайти тут коли-найкраще у використанні- an-interface-in-java . Це дійсно залежить від того, що ви будуєте, і скільки масштабність, копіювання коду тощо ви хочете/не хочете мати.

1
додано
Я також додати, що поліморфізм є чудовим визначенням щодо використання інтерфейсів і чому ми повинні їх використовувати.
додано Автор pepuch, джерело
Звичайно, це головне використання насправді. Дякую!
додано Автор Tala, джерело

Багато класів використовують інтерфейси для виконання деяких функцій, спираючись на інших програмістів, щоб реалізувати цей інтерфейс відповідно до контракту , який регулює інтерфейс . Такі класи є, наприклад, KeyListeners, MouseListeners , Runnable тощо.

Наприклад: JVM знає, що робити з Thread , як розпочати його, зупиняти його, маніпулювати ним, але не знає, що має зробити ваш Thread , щоб ви потрібно реалізувати інтерфейс Runnable .


Інтерфейси пропонують вам рівень абстракції, який можна використовувати в інших класах. Наприклад, якщо у вас є інтерфейс під назвою GemetricFigure , в класі, який надрукує обрій з GeometricFigure , ви можете перейти до списку всіх < em> GeometricFigures , наприклад:

public class Canvas {

   private List figures;

   public void print() {
       for (GeometricFigure figure : figure) {
           System.out.println(figure.getGirth());
       }
   }

}

І якщо GeometricFigure має тільки цей метод:

public interface GeometricFigure {

    public Double getGirth();

}

Вам не подобається, як реалізувати цей інтерфейс Square або Circle . В іншому випадку, якщо інтерфейсу не було, ви не могли б мати список GeometricFigures в Canvas , але список для кожного типу рисунка.

1
додано
@RaviChandran Погляньте на цей приклад, який я щойно написав. Це незмінно та має коментарі, тому вам буде набагато зрозуміліше: pastebin.com/5kmLgVVK
додано Автор darijan, джерело
його дійсно цікаво Darijan ... Ви можете бути більш ясним з тим, що figure.getGirth() друкує ....... трохи ясно на ваш код ....
додано Автор Ravi Chandran, джерело
Ви додали задоволення .... дякую.
додано Автор Ravi Chandran, джерело

Ось що стосується об'єктно-орієнтованого програмування. Інтерфейси використовуються для виконання поліморфізму . Ви сказали, що ви можете реалізувати в code2 для обох класів, що, якщо в майбутньому є user3, якому потрібно doCalculation . Ви можете просто застосувати цей інтерфейс і надіслати ваш calculate у свою власну форму.

Якщо ви хочете надати базові функції всім своїм користувачам, abstract classes надходить у зображення, де ви можете оголосити абстрактний метод do calculate і забезпечити реалізацію тих базових функцій, які потім кожен користувач буде розширювати і може doCalculation по-своєму.

0
додано

Інтерфейс - це контракт , який повинен відповідати ваш клас реалізації. Зазвичай, ви будете писати інтерфейс і зробити весь ваш клас реалізувати його з їх власною реалізації.

Приклад:

interface IExporter {
    public void export();
}

public class PDFExport implements IExporter {
    public void export(){
    //code for PDF Exporting
    }
}

public class XLSExport implements IExporter {
    public void export(){
    //code for XLS Exporting
    }
}

public class DOCExport implements IExporter {
    public void export(){
    //code for DOC Exporting
    }
}
0
додано

За допомогою підходу інтерфейсу ви можете зробити наступне:

List list = new ArrayList

Це не працює з другим підходом. Інтерфейси призначені для коду, який використовує ваші класи, а не для самих самих класів.

0
додано

Ви можете використовувати інтерфейси у багатьох випадках. Також ситуація, яку ви описуєте: вам не потрібно знати, яка реалізація у вас є.

Наприклад, у вашому коді є метод, який повертає поточний користувач, навіть якщо ви не знаєте, чи це реалізація User1 або User2, однак обидва з них можуть обчислювати щось методом doCalculation. Я додаю справді приклад такої ситуації:

public void dummyExampleCalculation() {

   getCurrentUser().doCalculation();

}

public MyInterface getCurrentUser() {

   if(...) {
      return new User1();
   } else {
      return new User2();
   }

}
0
додано

Інтерфейс в Java використовується для накладання правила виконання на класи. Це означає, що ви можете оголосити підпис функцій у інтерфейсах, а потім виконати цю функцію в різних класах, точно виконуючи підпис функції.

Ви можете побачити чіткий і реалістичний приклад на наступній веб-сторінці

http://www.csnotes32.com/2014/10/interface-in -java.html

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників