2009-04-23 9 views
18

¿Los métodos de construcción en las interfaces son incorrectos?métodos de constructor en las interfaces

+4

Dado que no se puede crear una instancia de una interfaz, ¿cómo se podría usar? –

+2

Me refiero a especificar un constructor en una interfaz. –

+0

Se ha eliminado la etiqueta subjetiva. No parece haber nada subjetivo sobre esta pregunta. – JaredPar

Respuesta

2

Independientemente de que sean malas o malas, no conozco ningún lenguaje que tenga la capacidad de especificar un constructor en una interfaz.

Dicho esto, sin embargo, personalmente no creo que el constructor de un objeto sea parte de la interfaz de ese objeto y, como tal, agregar un constructor a una interfaz inhibiría la flexibilidad natural que proporcionan las interfaces.

+7

Es tarde, pero PHP tiene esta habilidad. (Esto no lo hace una característica que vale la pena tener, pero esa es solo mi opinión.) – lotsoffreetime

12

Son malos porque no sirven para nada. En esencia, una interfaz es simplemente un contrato de transferencia de datos. No hay ninguna implementación adjunta con una interfaz y, por lo tanto, no hay nada que inicializar ni la necesidad de un constructor.

Si necesita algún tipo de inicialización, es mucho mejor usar una clase abstracta.

+6

Por cierto, creo, la interfaz es más que "simplemente contrato de transferencia de datos". Se debe considerar como un contrato de responsabilidad que a su vez incluye la especificación de la firma. – isntn

+3

@isntn, en su núcleo, lo único que hace una interfaz es especificar cómo pasar los datos. El único pensamiento que garantiza el comportamiento son los contratos y los marcos de prueba. Las interfaces pueden implicar un comportamiento pero no pueden garantizarlo – JaredPar

+0

Estoy de acuerdo con JaredPar. Si tiene el constructor en su interfaz, parece que necesita una Clase abstracta. Obtendrá un comportamiento común para los componentes que implementan esta interfaz, al menos para los métodos setter/getter relacionados con las variables pasadas al método __construct, por lo que debería ir, IMO, a una clase abstracta en este contexto. –

4

Aunque las interfaces no pueden tener constructores en la mayoría de los lenguajes, el Factory pattern proporciona un contrato para construir objetos, similar a una interfaz. Mira eso.

36

¿Por qué la gente piensa que alguien quiere crear una instancia de la interfaz?

Lo que queremos hacer es forzar a los implementadores a implementar el constructor, al igual que otros métodos de interfaz.

Una interfaz es como un contrato. Digamos que tengo una interfaz Queue, y quiero asegurarme de que los implementadores creen un constructor con un argumento, lo que crea una cola singleton (una nueva cola con solo ese elemento). ¿Por qué no debería ser parte del contrato? Con al menos interfaces Java, eso no se puede especificar.

+12

+1 Entonces, no, no están mal. "¿Por qué la gente piensa que alguien quiere crear una instancia de la interfaz?" De acuerdo, IMO, el OP no estaba preguntando eso. Si una clase requiere un valor cada vez que se crea una instancia (por ejemplo, una clase contenedora), me parece que un contrato de transferencia de datos puede ser útil. Particularmente en PHP donde los métodos no pueden ser anulados - el constructor está "bloqueado" a un cierto comportamiento. – Ben

+4

Los métodos se pueden anular en PHP pero no están sobrecargados. –

+2

Quizás @Steve se refería a la obligación de hacer coincidir la firma del constructor. – XedinUnknown

5

En primer lugar, no estoy de acuerdo con que la interfaz sea solo un contrato de transferencia de datos. Si eso fuera cierto, se le permitiría definir propiedades en una interfaz.

Yo exactamente no pensaría que es raro para hacer algo como:

interface IDBConnection 
{ 
    function __construct($connectionString); 
    function executeNonQuery($commandText, $paramters=null); 
    function executeScalar($commandText, $paramters=null); 
    function executeSingle($commandText, $paramters=null); 
    function executeArray($commandText, $paramters=null); 
} 

Esto le permitirá crear instancias de clases de terceros para el acceso a datos basados ​​en la simple reflexión en lugar de simplemente ser un contrato de datos.

Estoy bastante seguro de que este no es el mejor ejemplo, me gustaría ir a una clase base abstracta aquí en el mundo real, pero también estoy bastante seguro de que hay razones perfectamente válidas para definir un constructor contrato de métodos en una interfaz que no he pensado.

No lo he visto hecho, pero no creo que sea extraño o malo.

Cuestiones relacionadas