2012-02-26 19 views
6

Duplicar posible:
Interfaces: Why can't I seem to grasp them?
Why would I want to use Interfaces?¿Por qué necesito la interfaz?

creo que esta pregunta se repite 1000 veces y lo siento por preguntar de nuevo. Realmente busco una respuesta simple y simple por la que explícitamente necesito una interfaz, o si me explica algo que no puedo lograr sin Interface.

Si es una herencia múltiple, entonces le pediría que me diera un ejemplo simple a través del cual puedo entender por qué necesito la interfaz.

--Thx por adelantado.

Nota: estoy haciendo esta pregunta en el contexto de .NET (C#) lengua

Edit1: Por ahora cada vez que trato de aprender interfaz de Mi mente me dice -> "amigo que se va a perfila el cuerpo de alguien en una hoja blanca "Pero necesitas otra hoja blanca donde tienes que volver a dibujar el contorno, dibujar todas las partes del cuerpo y rellenar los colores para obtener la imagen real". Entonces, ¿por qué desperdicio la primera hoja en blanco para obtener el esquema.

+0

Esto puede ayudar: las interfaces describen los atributos * periféricos *, las clases abstractas definen las funciones * core *. – Jason

+0

si desea que su proyecto sea compatible con diferentes bases de datos. para que el cliente pueda cambiar su base de datos en el futuro, usamos interfaces que contienen procedimientos de propiedad en el archivo de clase sin alterar objetos ........ –

+0

Hay docenas de posibles duplicados de esta pregunta ... aquí hay algunos: [1 ] (http://stackoverflow.com/questions/240152/why-would-i-want-to-use-interfaces), [2] (http://stackoverflow.com/questions/3355408/explaining-interfaces-to -estudiantes), [3] (http://stackoverflow.com/questions/122883/interfaces-why-cant-i-seem-to-grasp-them) –

Respuesta

12

La forma más fácil de entender las interfaces es que permiten que diferentes objetos expongan la funcionalidad COMÚN. Esto le permite al programador escribir un código mucho más simple y corto que los programas a una interfaz, entonces, siempre y cuando los objetos implementen esa interfaz, funcionará.

Proveedores

Base de Datos:

Hay muchos diferentes proveedores de bases de datos, MySQL, MSSQL, Oracle, etc. Sin embargo todos los objetos de base de datos pueden hacer las mismas cosas por lo que encontrará muchas interfaces para objetos de base. Si un objeto implementa IDBConnection, entonces expone los métodos Open() y Close(). Entonces, si quiero que mi programa sea independiente de la base de datos, programo en la interfaz y no a los proveedores específicos.

IDbConnection connection = GetDatabaseConnectionFromConfig() 
connection.Open() 
// do stuff 
connection.Close() 

Ver por la programación de una interfaz (IDbConnection) ahora puede intercambiar cualquier proveedor de datos de configuración en mi, pero mi código se mantiene exactamente el mismo. Esta flexibilidad puede ser extremadamente útil y fácil de mantener. La desventaja de esto es que solo puedo realizar operaciones de base de datos 'genéricas' y es posible que no utilice por completo la fortaleza que ofrece cada proveedor en particular, así como con todo en la programación tiene una compensación y debe determinar qué escenario lo beneficiará más.

Colecciones:

Si se observa casi todas las colecciones implementan esta interfaz llamada IEnumerable. IEnumerable devuelve un IEnumerator que tiene MoveNext(), Current y Reset(). Esto permite que C# se mueva fácilmente a través de su colección. La razón por la que puede hacer esto es porque expone la interfaz IEnumerable. SABE que el objeto expone los métodos que necesita para atravesarlo. Esto hace dos cosas. 1) los bucles foreach ahora sabrán cómo enumerar la colección y 2) ahora puede aplicar poderosas exprsiones LINQ a su colección. De nuevo, la razón por la cual las interfaces son tan útiles aquí es porque todas las colecciones tienen algo en COMÚN, pueden moverse a través de ellas. Cada colección se puede mover de una manera diferente (lista vinculada vs matriz) pero esa es la belleza de las interfaces, es que la implementación está oculta e irrelevante para el consumidor de la interfaz. MoveNext() le proporciona el siguiente elemento de la colección, no importa cómo lo hace. Muy bien, ¿eh?

polimorfismo

Al diseñar sus propias interfaces sólo hay que hacerse una pregunta. ¿Qué tienen estas cosas en común? Una vez que encuentre todas las cosas que comparten los objetos, abstraiga esas propiedades/métodos en una interfaz para que cada objeto pueda heredar de ella. Entonces puede programar contra varios objetos usando una interfaz.

Y, por supuesto, tengo que dar mi ejemplo polimórfico de C++ favorito, el ejemplo de los animales. Todos los animales comparten ciertas características. Digamos que pueden Mover, Hablar y todos tienen un Nombre. Como acabo de identificar lo que todos mis animales tienen en común y puedo abstraer esas cualidades en la interfaz IAnimal. Luego creo un objeto Bear, un objeto Owl y un objeto Snake que implementan esta interfaz.La razón por la que puede almacenar juntos diferentes objetos que implementan la misma interfaz es porque las interfaces representan una reasignación IS-A. Un oso es un animal IS-A, un búho ES-Un animal, por lo que hace que pueda recogerlos a todos como animales.

var animals = new IAnimal[] = {new Bear(), new Owl(), new Snake()} // here I can collect different objects in a single collection because they inherit from the same interface 

foreach (IAnimal animal in animals) 
{ 
    Console.WriteLine(animal.Name) 
    animal.Speak() // a bear growls, a owl hoots, and a snake hisses 
    animal.Move() // bear runs, owl flys, snake slithers 
} 

Se puede ver que a pesar de que estos animales realizan cada acción de una manera diferente, puedo programar contra todos ellos en un modelo unificado y esto es sólo una de las muchas ventajas de las interfaces.

De nuevo, lo más importante con las interfaces es qué tienen los objetos en común para que pueda programar contra los objetos DIFERENTES de la MISMA manera. Ahorra tiempo, crea aplicaciones más flexibles, oculta la complejidad/implementación, modela objetos/situaciones del mundo real, entre muchos otros beneficios.

Espero que esto ayude.

+2

Excelente respuesta. –

+0

Una de las mejores explicaciones del razonamiento detrás del uso de la interfaz. – rajibdotnet

+0

Marcando esta respuesta. +1. – Jogi

6

Una interfaz es Contrato por lo que la clase puede hacer, esto significa que una sola clase puede cumplir múltiples contratos s.

Una clase abstracta es una plantilla sobre cómo debe comportarse una clase, solo puede completar una plantilla por clase.

Una clase extendida toma un objeto existente y agrega/cambia la funcionalidad, solo puede extender una clase principal por clase.

Utilizaría un contrato (Interfaz) si desea describir cómo debería actuar algo sin definir la implementación específica. Este contrato puede ser cumplido por cualquier otra clase que implemente los métodos/propiedades que están definidos.

Utilizaría una clase abstracta si desea especificar parte de la funcionalidad por adelantado y luego agregarla.

EDIT: Considere esto:

Tiene una aplicación que necesita para almacenar algunos datos dicen EntityA pero puede tener varias formas en las que puedes guardar los datos (por ejemplo, XML, bases de datos SQL, CSV etc.). Puede crear una clase para cada uno de estos métodos diferentes para almacenar EntityA. pero cuando quisieras cambiar el método necesitarías especificar explícitamente el tipo que deseas allí mismo.

es decir

public class DoStuffWithEntityA{ 
    public void DoStuffAndStoreAsXml(EntityA entity){ /*Logic*/} 
    public void DoStuffAndStoreAsCsv(EntityA entity){ /*Logic*/} 
    public void DoStuffAndStoreInDatabase(EntityA entity){ /*Logic*/} 
} 

prehaps una mejor manera es utilizar una interfaz que describe, en general, lo que algo que almacena EntityA se vería así.

por ejemplo

public interface IStoreEntityA{ 
    void Store(EnitityA entity); 
} 

a continuación, sólo podría decir que usted quiere algo que almacena EntityA en el código

public class DoStuffWithEntityA{ 
    private IStoreEntityA _entityAStorer; 
    public DoStuffWithEntityA(IStoreEntityA howIStoreEntityA){ _entityAStorer = howIStoreEntityA;} 
    public void DoStuff(EntityA entity) 
    { 
     //Do Stuff 
     _entityAStorer.Store(entity); 
    } 
} 

Esto significa que su isnt lógica estrechamente unida a la forma en que almacena EntityA

+0

Gracias por su respuesta. Pero si lees mi nueva edición entenderás lo que está pasando en mi mente. Será útil si me das algún ejemplo. Thx –

+0

Vea mi edición para un escenario aquí, básicamente, a veces es posible que no desee/necesite saber cómo se implementa algo, de manera que solo solicite cualquier cosa que cumpla con un contrato específico. –

Cuestiones relacionadas