Domanda

In C# abbiamo le interfacce.Da dove vengono questi?Non esistevano in C++.

È stato utile?

Soluzione

Le interfacce sono piuttosto vecchie e sono in circolazione da un bel po'.

I primi linguaggi non orientati agli oggetti (dalla metà alla fine degli anni '70) come Modula ed Euclid utilizzavano costrutti chiamati "moduli" per specificare le interfacce tra i componenti.I componenti comunicherebbero quindi tra loro tramite moduli di importazione ed esportazione espliciti.Le interfacce in C# sono evoluzioni orientate agli oggetti dello stesso concetto.

Le interfacce in C# si estendono direttamente dal concetto di interfacce in C++ (e Java), dove venivano utilizzate come parte di COM per descrivere le interfacce dei componenti orientati agli oggetti.

MODIFICARE: Facendo una piccola ricerca, il primo linguaggio che ho trovato con una parola chiave esplicita "interfaccia" è stato Modula-3, un derivato di Modula creato intorno al 1986.

Altri suggerimenti

Le interfacce erano anche una parte centrale di COM, che era una tecnologia di grande successo per separare le interfacce dall'implementazione.

Provengono da Java e sono stati introdotti perché Java (e C#) non consentono l'ereditarietà multipla.

MODIFICARE: Ricevo alcuni downmod perché le persone che utilizzano le interfacce COM in C++ non sono d'accordo con l'affermazione di cui sopra.Indipendentemente da ciò, il concetto di interfaccia deriva da Java, le interfacce COM C++ erano classi virtuali, Java è stato il primo linguaggio a renderlo una funzionalità del linguaggio.

FINE MODIFICA

Ad esempio, in C++, potresti avere una classe denominata Dog che eredita da Animal e Mammal.

In C#, avresti una classe base denominata Animal e utilizzeresti un'interfaccia (IMammal).La notazione di denominazione I è storica di C++ (era usata per indicare una classe virtuale astratta) ed è stata trasferita in Java ma è più significativa in C#, perché non esiste un modo semplice per dire cos'è una classe base e cos'è una interfaccia da una dichiarazione di classe C#:

public class Dog : Animal, IMammal

mentre in Java era più ovvio:

public class Dog extends Animal implements IMammal

L'ereditarietà multipla è molto complicata, quindi sono state derivate delle interfacce per semplificarla.Una classe C# può ereditare solo da una classe base, ma può implementare N quantità di interfacce.

In C++, le interfacce possono essere simulate utilizzando classi virtuali pure.Ciò richiede che tutti i metodi vengano sovrascritti polimorficamente dalla classe ereditaria.

Avevo l'impressione che il primo formalizzato il concetto di interfacce proveniva da Objective-C (chiamati "protocolli").Posso dirti con certezza che Java almeno ha preso l'idea da Objective-C, quindi non è stato Java ad avere prima le interfacce.

E-mail da Patrick Naughton

Le interfacce esistevano in C++ se si programmava COM, da cui ha origine la convenzione IPrefix.

Sebbene lo stesso C++ non supportasse nativamente le interfacce, COM/C++ utilizzava librerie di tipi generate da Interface Definition Language che ha l'unico scopo di definire le interfacce e utilizzava il metodo interfaccia parola chiave molto prima che lo facessero Java o C#.

Oltre a consentire una forma di ereditarietà multipla, la motivazione di .NET per le interfacce ha a che fare con le sue origini orientate ai componenti e il suo scopo principale è definire contratti tra componenti che possono interagire senza alcuna conoscenza delle reciproche implementazioni.Parte dell'interoperabilità COM viene eseguita anche con le interfacce .NET.

Il C++ consente l'ereditarietà multipla.Quando fu sviluppato Java, fu decisa l'ereditarietà singola, tuttavia alle classi fu consentito implementare più interfacce.C# ha portato avanti questo concetto.

Esistevano in C++, ma erano conosciute come classi base virtuali, che consistevano solo di pure funzioni virtuali.Da qui deriva il prefisso "I-" per le interfacce, per distinguere tra classi base virtuali e classi base astratte.

ho visto prima l'interfaccia delle parole chiave in Java, ma sono molto più vecchie di così.

lo stesso concetto esiste in C++ ma non è esattamente la stessa cosa.Si chiamano "classi virtuali pure"

http://en.wikipedia.org/wiki/Virtual_function

Esistono con una sintassi diversa ma sono lì per consentire il polimorfismo in OOP.

La prima implementazione di interfacce di cui sono a conoscenza nel settore informatico proveniva da CORBA.

Da quanto ho capito, il concetto è nato dall'ingegneria elettrica ed elettronica, dove una presa di corrente a muro, ad esempio, può essere utilizzata (e implementata) da chiunque conosca le specifiche.Le interfacce forniscono quindi la stessa flessibilità a livello di programmazione.

Per inciso, anche se non sono stati creati per ridurre i problemi di versione, possono sicuramente aiutare a risolverli.

Penso che le interfacce provengano dal fatto che alcuni programmatori si stancarono di scrivere l'implementazione di un metodo più e più volte.Quante volte puoi scrivere:

static string Method(int i)

senza pensare che ci debba essere un modo più semplice?

In C++ potresti avere una classe astratta senza implementazione e potresti ereditare più classi.Java e C# si sono sbarazzati dell'ereditarietà multipla, quindi per avere la possibilità di ereditare più contratti (non comportamenti), hanno creato interfacce.Puoi ereditare solo una classe in C#, ma puoi ereditare tutte le interfacce che desideri.

Un'interfaccia è semplicemente un contratto.Indica quali membri un'istanza deve implementare.Lo fa, tuttavia, senza implementare alcun comportamento predefinito.

Beh, non esisteva alcuna sintassi del meccanismo integrato nel linguaggio, ma puoi ottenere interfacce in C++ con classi virtuali pure.

class IFoo
{
public:
  void Bar() =0;
  void Bar2() =0;
};

class Concrete : public IFoo
{
public:
  void Bar() { ... }
  void Bar2() { ... }
}

Le interfacce provenivano dall'informatica.O, diciamo, dal buon senso nella programmazione.L'interfaccia è un gruppo logico di metodi di una classe.Il C++ non aveva bisogno di a concetto di linguaggio separato di "interfaccia", perché qualsiasi classe potrebbe essere utilizzata come interfaccia: basta definire un insieme di metodi al suo interno, non eseguire alcuna implementazione, chiamarla come IExecutable e utilizzare:

class IExecutable
{
public:
    virtual void Execute() = 0;
};

class MyClass : public IExecutable
{
public:
    void Execute() { return; };
};

Alcuni linguaggi, chiamati "tipizzati dinamicamente", come Python, non richiedono affatto la definizione di interfacce, basta chiamare un metodo che ti serve e il runtime controlla se è possibile ("Se cammina come un'anatra e parla come un'anatra, dev'essere un'anatra").

C# separa chiaramente il concetto di interfacce dalle classi, perché utilizza la tipizzazione statica...e l'ereditarietà multipla è vietata in quella lingua, ma è ok che una classe abbia una classe base e un'altra interfaccia o implementi più interfacce alla volta.

public interface IPurring
{
    void Purr();
}

public class Cat : Animal, IPurring
{
    public Cat(bool _isAlive)
    {
        isAlive = _isAlive;
    }

    #region IPurring Members

    public void Purr()
    {
        //implement purring
    }

    #endregion
}

Sebbene non siano chiamati "interfacce", i puntatori alla struttura dati C con puntatori a funzione come elementi della struttura implementavano il concetto di interfacce molto prima che C++ lo facesse con le classi base virtuali IMO.

Le interfacce sono state utilizzate anche in CORBA.L'IDL (Interface Definition Language) è stato utilizzato per descrivere le interfacce indipendentemente dal linguaggio in cui è stato implementato l'oggetto.Ciò separava non solo l'interfaccia e l'implementazione, ma anche l'interfaccia e il legame con il linguaggio.

È solo un altro livello di astrazione.Non sono proprio sicuro da dove provenga..Li sento ancora spesso chiamare contratti anziché interfacce.

Penso che l'idea di base sia "ereditarietà multipla".Quindi l'idea è venuta dal C++.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top