Jaka jest definicja "interfejsu" w programowaniu obiektowym

Ok, mój znajomy zastanawia się co znaczy "interfejs" w programowaniu.

Jaki jest najlepszy Opis "interfejsu".

Dla mnie interfejs jest schematem klasy, czy to Najlepsza definicja?

Author: Gnoupi, 2010-05-19

16 answers

Interfejs jest jednym z bardziej przeciążonych i mylących terminów w rozwoju.

Jest to właściwie pojęcie abstrakcji i enkapsulacji. Dla danego "pudełka", deklaruje "wejścia" i "wyjścia" tego pudełka. W świecie oprogramowania zwykle oznacza to operacje, które mogą być wywoływane na pudełku (wraz z argumentami), a w niektórych przypadkach typy zwrotne tych operacji.

To, czego nie robi, to to, że nie definiuje semantyki tych operacje są, choć powszechną (i bardzo dobrą praktyką) praktyką jest dokumentowanie ich w pobliżu deklaracji (np. poprzez komentarze) lub wybieranie dobrych konwencji nazewnictwa. Nie ma jednak gwarancji, że zamiary te zostaną zrealizowane.

Oto analogia: spójrz na swój telewizor, gdy jest wyłączony. Jego interfejs to przyciski, które ma, różne wtyczki i ekran. Jego semantyka i zachowanie polega na tym, że przyjmuje wejścia (np. programowanie kabli) i ma wyjścia (wyświetlanie na ekranie, dźwięk itp.). Jednak gdy patrzysz na telewizor, który nie jest podłączony, wyświetlasz oczekiwaną semantykę w interfejsie. Telewizor może wybuchnąć, gdy go podłączysz. Jednak na podstawie jego "interfejsu" można założyć, że nie zrobi żadnej kawy, ponieważ nie ma ujęcia wody.

W programowaniu obiektowym interfejs ogólnie definiuje zestaw metod (lub komunikatów), które instancja klasy ma interfejs może odpowiedzieć.

To, co dodaje zamieszania, to fakt, że w niektórych językach, takich jak Java, istnieje rzeczywisty interfejs z semantyką specyficzną dla danego języka. Na przykład w Javie jest to zbiór deklaracji metod, bez implementacji, ale interfejs również odpowiada typowi i przestrzega różnych reguł typowania.

W innych językach, takich jak C++, nie masz interfejsów. Sama klasa definiuje metody, ale można myśleć o interfejsie klasy jako o deklaracje metod niepublicznych. Ze względu na sposób kompilacji C++, otrzymujesz pliki nagłówkowe, w których możesz mieć" interfejs " klasy bez rzeczywistej implementacji. Można również naśladować interfejsy Javy z abstrakcyjnymi klasami z czystymi funkcjami wirtualnymi itp.

Interfejs z pewnością nie jest schematem klasy. Plan, według jednej definicji jest "szczegółowym planem działania". Interfejs nic nie obiecuje o działaniu! Źródłem zamieszania jest to, że w większości języki, jeśli masz typ interfejsu, który definiuje zestaw metod, klasa, która go implementuje "powtarza" te same metody (ale zapewnia definicję), więc interfejs wygląda jak szkielet lub zarys klasy.

 138
Author: Uri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-18 05:56:41

Rozważ następującą sytuację:

jesteś w środku dużego, pustego pokoju, gdy nagle atakuje cię zombie.

nie masz broni.

na szczęście w drzwiach pokoju stoi człowiek.

"szybko!"krzyczysz na niego. "Rzuć mi coś, czym mogę trafić zombie!"

Rozważmy teraz:
Nie określiłeś (ani cię to nie obchodzi) dokładnie Co Twoje friend will choose to toss;
...Ale to nie ma znaczenia, o ile:

  • To coś, co Może być rzucone (nie może rzucić ci sofy)

  • Jest to coś, co można chwycić (miejmy nadzieję, że nie rzucił shuriken)

  • Jest to coś, czego możesz użyć, aby rozwalić mózg zombie (co wyklucza poduszki i takie tam)

Nieważne, czy dostaniesz kij baseballowy, czy młotek -
tak długo, jak to / align = "left" /

Podsumowując:

Kiedy piszesz interfejs, w zasadzie mówisz: "potrzebuję czegoś takiego..."

 129
Author: Yehuda Shapira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-09 19:14:30

Interfejs jest kontraktem, który powinieneś wykonać lub dać, w zależności od tego, czy jesteś wykonawcą, czy użytkownikiem.

 30
Author: Eugene Kuleshov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 15:37:46

Myślę, że "blueprint"nie jest dobrym słowem. Plan mówi ci, jak coś zbudować. Interfejs unika mówienia Ci, jak coś zbudować.

Interfejs określa, w jaki sposób można wchodzić w interakcje z klasą, tzn. jakie metody obsługuje.

 16
Author: Dave Costa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 15:38:09

Dla mnie interfejs jest schematem klasy, czy to Najlepsza definicja?

Nie. Plan zazwyczaj obejmuje wewnętrzne. Ale interfejs jest czysto o tym, co jest widoczne na zewnątrz klasy ... a dokładniej, rodzina klas, które implementują interfejs.

Interfejs składa się z podpisów metod i wartości stałych, a także (typowo nieformalnej) "umowy behawioralnej" pomiędzy klasami implementującymi interfejs i inni, którzy go używają.

 7
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 15:39:07

Technicznie opisałbym interfejs jako zbiór sposobów (metody, właściwości, accessory... słownictwo zależy od używanego języka) do interakcji z obiektem. Jeśli obiekt obsługuje / implementuje interfejs, możesz użyć wszystkich sposobów określonych w interfejsie do interakcji z tym obiektem.

Semantycznie interfejs może również zawierać konwencje dotyczące tego, co możesz zrobić lub nie (np. kolejność, w jakiej możesz wywoływać metody) i o tym, co, w return, można założyć o stanie obiektu biorąc pod uwagę, jak interakcji do tej pory.

 4
Author: Ghislain Fourny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 15:46:51

W programowaniu interfejs definiuje zachowanie obiektu, ale w rzeczywistości nie określa jego zachowania. Jest to kontrakt, który zagwarantuje, że pewna klasa może coś zrobić.

Rozważ ten fragment kodu C# tutaj:

using System;

public interface IGenerate
{
    int Generate();
}

// Dependencies
public class KnownNumber : IGenerate
{
    public int Generate() 
    {
        return 5;
    }   
}

public class SecretNumber : IGenerate
{
    public int Generate()
    {
        return new Random().Next(0, 10);
    }
}

// What you care about
class Game
{
    public Game(IGenerate generator) 
    {
        Console.WriteLine(generator.Generate())
    }
}

new Game(new SecretNumber());
new Game(new KnownNumber());

Klasa gry wymaga tajnego numeru. W celu jej przetestowania, chciałbyś wprowadzić to, co będzie używane jako numer tajny (zasada ta nazywa się inwersją sterowania).

Klasa gry chce być "otwarty umysł" o to, co faktycznie stworzy liczbę losową, dlatego zapyta w swoim konstruktorze o "wszystko, co ma metodę generowania".

Po pierwsze, interfejs określa, jakie operacje obiekt dostarczy. Zawiera tylko to, jak wygląda, ale nie podano rzeczywistej implementacji. To tylko podpis metody. Konwencjonalnie, w C# interfejsy są poprzedzone przez I. Klasy teraz implementują interfejs IGenerate. Oznacza to, że kompilator będzie oczywiście, że obie mają metodę, która zwraca int i jest wywoływana Generate. Grę nazywa się teraz dwoma różnymi obiektami, z których każdy implementuje poprawny interfejs. Inne klasy spowodowałyby błąd podczas budowania kodu.

Tutaj zauważyłem analogię, której użyłeś:

Klasa jest powszechnie postrzegana jako wzór dla obiektu. Interfejs określa coś, co klasa będzie musiała zrobić, więc można argumentować, że rzeczywiście jest to tylko schemat dla klasy, ale ponieważ Klasa niekoniecznie potrzebuje interfejsu, argumentowałbym, że ta metafora się łamie. Pomyśl o interfejsie jak o kontrakcie. Klasa, która ją "podpisze" będzie prawnie zobowiązana (egzekwowana przez policję kompilatora) do przestrzegania warunków umowy. Oznacza to, że będzie musiał zrobić, co jest określone w interfejsie.

Jest to spowodowane statycznie typowaną naturą niektórych języków OO, jak to ma miejsce w przypadku Javy lub C#. Z drugiej strony w Pythonie, stosuje się inny mechanizm:
import random

# Dependencies
class KnownNumber(object):
    def generate(self):
        return 5

class SecretNumber(object):
    def generate(self):
        return random.randint(0,10)

# What you care about
class SecretGame(object):
    def __init__(self, number_generator):
        number = number_generator.generate()
        print number

Tutaj żadna z klas nie implementuje interfejsu. Python nie dba o to, ponieważ klasa SecretGame po prostu spróbuje wywołać dowolny obiekt, który zostanie przekazany. Jeśli obiekt posiada metodę generate (), wszystko jest w porządku. Jeśli nie: KAPUTT! Ten błąd nie będzie widoczny podczas kompilacji, ale podczas wykonywania, więc prawdopodobnie, gdy program jest już wdrożony i uruchomiony. C# powiadomi Cię o tym na długo przed tym, jak się do tego zbliżysz.

Powodem tego mechanizm jest używany, naiwnie podany, ponieważ w językach OO funkcje naturalnie nie są obywatelami pierwszej klasy. Jak widać, KnownNumber i SecretNumber zawierają tylko funkcje generujące liczbę. Tak naprawdę nie trzeba klas w ogóle. W Pythonie można więc po prostu je wyrzucić i samodzielnie wybrać funkcje:

# OO Approach
SecretGame(SecretNumber())
SecretGame(KnownNumber())

# Functional Approach

# Dependencies
class SecretGame(object):
    def __init__(self, generate):
        number =  generate()
        print number

SecretGame(lambda: random.randint(0,10))
SecretGame(lambda: 5)

Lambda jest tylko funkcją, która została zadeklarowana "w linii, jak idziesz". Delegat jest taki sam w C#:

class Game
{
    public Game(Func<int> generate) 
    {
        Console.WriteLine(generate())
    }
}    

new Game(() => 5);
new Game(() => new Random().Next(0, 10));

Te ostatnie przykłady nie są możliwe tak w Javie, ponieważ Java nie może poruszać się z funkcjami, jak dwa pozostałe (Python i C#). Tam, interfejsy są jedynym sposobem na speficiying zachowanie w ten sposób w av.

 3
Author: cessor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-11 08:07:53

Osobiście widzę interfejs podobny do szablonu. Jeśli interfejs zawiera definicję metod foo () i bar (), to wiesz, że każda klasa używająca tego interfejsu ma metody foo () i bar ().

 2
Author: Thomas Winsnes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 16:06:05

Rozważmy, że człowiek (Użytkownik lub obiekt) chce wykonać jakąś pracę. Skontaktuje się z pośrednikiem (Interface), który będzie miał umowę z firmami (real world objects created using implemented classes). Kilka rodzajów prac zostanie przez niego zdefiniowanych, które firmy będą wdrażać i dadzą mu wyniki. Każda firma będzie realizować prace na swój sposób, ale wynik będzie taki sam. Tak jak ten użytkownik będzie wykonywać swoją pracę za pomocą jednego interfejsu. Myślę, że interfejs będzie działał jako widoczna część systemów z kilkoma poleceniami, które będą zdefiniowane wewnętrznie przez implementujące systemy wewnętrzne.

 2
Author: Arun N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-25 13:59:24

Interfejs to "jakie zadanie" metoda nie "jak". To kontrakt. Podobnie jak w kolejce priorytetów, wiesz, co z nią zrobić, ale podstawowej implementacji nie znasz. Klasa zgadza się nigdy zmienić" efekty " istniejących operacji, a Klient wyraża zgodę na korzystanie z klasy ściśle na podstawie jej interfejsu i ignorować wszelkie implementacje szczegóły.

Laik np.: Pomyśl o posiadaniu uniwersalnego pilota, który może sterować każdym telewizorem, czy to stary model lampowy czy który wykorzystuje ekran LCD lub plazma. Naciśnij 2, następnie 5, a następnie Enter, a każdy z ekranów wyświetli kanał 25, mimo, że mechanizm, aby to się stało, jest znacznie różny w zależności na temat podstawowej technologii.

 2
Author: Muddassir Zafar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-18 17:18:38

Interfejs oddziela operacje na klasie od implementacji wewnątrz. W związku z tym niektóre implementacje mogą zawierać wiele interfejsów.

Ludzie zazwyczaj opisują to jako "kontrakt" na to, co musi być dostępne w metodach klasy.

To absolutnie nie jest plan, ponieważ to również determinuje wdrożenie. Pełną definicję klasy można uznać za wzór.

 1
Author: Puppy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 15:42:18

Interfejs definiuje, co klasa, która dziedziczy z niego, musi zaimplementować. W ten sposób wiele klas może dziedziczyć z interfejsu i z tego powodu możesz

  • Upewnij się, że wszystkie elementy interfejsu są zaimplementowane w klasie pochodnej (nawet jeśli po prostu wyrzuca wyjątek)
  • Abstract away the class itself from the caller (cast a instance of a class to the interface, and interact with it without need to know what the actual derived class IS)

Aby uzyskać więcej informacji, zobacz to http://msdn.microsoft.com/en-us/library/ms173156.aspx

 1
Author: Greg Olmstead,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 15:48:28

Moim zdaniem interfejs ma szersze znaczenie niż ten powszechnie kojarzony z nim w Javie. Zdefiniowałbym "interfejs" jako zestaw dostępnych operacji z pewną wspólną funkcjonalnością, które pozwalają na sterowanie / monitorowanie modułu.

W tej definicji staram się objąć zarówno interfejsy programowe, gdzie klientem jest jakiś moduł, jak i interfejsy ludzkie (np. GUI).

Jak już powiedzieli inni, interfejs zawsze ma za sobą jakiś kontrakt, jeśli chodzi o wejścia i wyjścia. Interfejs nie obiecuje nic o" jak " operacji; gwarantuje jedynie pewne właściwości wyniku, biorąc pod uwagę aktualny stan, wybraną operację i jej parametry.

 1
Author: Eyal Schneider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 16:14:15

Jak wyżej, synonimy "umowy" i "protokołu" są odpowiednie.

Interfejs zawiera metody i właściwości, których można oczekiwać od klasy.

Więc jeśli klasa Cheetos Bag implementuje interfejs Chip Bag, powinieneś oczekiwać, że Cheetos Bag zachowa się dokładnie tak, jak każdy inny Chip Bag. (Czyli ujawnić metodę .attemptToOpenWithoutSpillingEverywhere() itp.)

 1
Author: wlangstroth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 16:36:58

Granica, przez którą komunikują się dwa systemy.

Interfejsy są sposobem, w jaki niektóre języki OO osiągają polimorfizm ad hoc . Polimorfizm Ad hoc to po prostu funkcje o tych samych nazwach działające na różnych typach.

 0
Author: cheecheeo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-10 07:05:59

Definicja konwencjonalna-interfejs jest kontraktem określającym metody, które muszą być zaimplementowane przez klasę implementującą go.

Definicja interfejsu zmieniała się z czasem. Myślisz, że interfejs ma tylko deklaracje metod ? Co ze statycznymi zmiennymi końcowymi, a co z domyślnymi definicjami po Javie 5.

Interfejsy zostały wprowadzone do Javy ze względu na problem Diamond z wielokrotnym dziedziczeniem i to właśnie zamierzają zrób.

Interfejsy są konstrukcjami, które zostały stworzone, aby uniknąć problemu wielokrotnego dziedziczenia i mogą mieć abstrakcyjne metody, domyślne definicje i statyczne zmienne końcowe.

Http://www.quora.com/Why-does-Java-allow-static-final-variables-in-interfaces-when-they-are-only-intended-to-be-contracts

 0
Author: Vivek Vermani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-25 17:50:50