tutorial poo oriented medium instanciar example español clases clase php oop

poo - php oop tutorial español



Métodos de construcción en interfaces. (6)

¿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 cola de interfaz 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 eso parte del contrato? Con al menos interfaces Java, eso no se puede especificar.

¿Son malos los métodos de construcción en las interfaces?


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


Debe instanciar objetos polimórficos inmutables en algún momento a través de su constructor que requiere parámetros y puede necesitar ese constructor en la interfaz por las mismas razones que necesita los otros métodos públicos en la interfaz, por ejemplo ...

Supongamos que tiene que crear una instancia de un objeto polimórfico, su clase implementando su interfaz y suministrada por el código del cliente. Como un escenario simple pero simple, digamos que este objeto es un objeto de valor y, como tal, debe ser inmutable, lo que significa que el estado del objeto debe ser válido desde el momento en que se crea una instancia ...

$immutablePolymorphe = $userConfig[''immutable_polymorphe_class'']; $immutablePolymorphe = new $immutablePolymorphe($state); // Then do something with that polymorphe...

Entonces, ¿qué pasa si no define el constructor con su parámetro en la interfaz? De ahí la razón por la que creo que un constructor en una interfaz puede ser tan legítimo como cualquier otro método público en una interfaz ...


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

No pensaría exactamente que es extraño 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ía crear instancias de clases de terceros para el acceso a datos basándose en una reflexión simple en lugar de ser solo un contrato de datos.

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

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


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

Si necesita algún tipo de inicialización, puede utilizar una clase abstracta.


Ya sea que sean malos o no, no conozco ningún idioma que tenga la capacidad de especificar un constructor en una interfaz.

Sin embargo, dicho esto, 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 ofrecen las interfaces.