En la mayoría de los idiomas existentes, los miembros [campos?] Se tratan fundamentalmente de manera diferente a los métodos, pero ¿TIENE que ser así?
Si lo hace.
Los campos de miembros son datos por instancia. Los datos deben existir en algún lugar de la memoria para cada instancia; debe haber una dirección o secuencia de direcciones reservadas para ello. En Java, .NET y muchos otros lenguajes OO, estos datos van en el montón.
Los métodos son datos por clase. Son punteros a una tabla. Así es como los métodos obtienen el despacho virtual. En realidad, solo hay una instancia asignada, por clase.
Una interfaz es esencialmente un tipo especial de clase que solo contiene métodos, no datos de instancia. Eso es parte de la definición de interfaz. Si contuviera algún dato, ya no sería una interfaz, sería una clase abstracta. Ambas opciones están bien, por supuesto, dependiendo de qué tipo de patrón de diseño estés tratando de implementar. Pero si agrega datos de instancia a las interfaces, eliminaría todo lo que las convierte en interfaces.
Bien, entonces ¿por qué un método de interfaz no puede apuntar a un campo miembro? Porque no hay nada a nivel de clase a lo que señalar. Una vez más, una interfaz no es más que una tabla de métodos. El compilador solo puede generar una tabla, y cada método debe apuntar a la misma dirección de memoria. Por lo tanto, es imposible que los métodos de interfaz apunten a campos de clase, porque el campo de clase es una dirección diferente para cada instancia.
Quizás el compilador podría aceptar esto de todos modos y generar un método getter para que señale la interfaz, pero eso se convierte esencialmente en una propiedad . Si quieres saber por qué Java no tiene propiedades, bueno ... esa es una historia muy larga y tediosa en la que preferiría no entrar aquí. Pero si usted está interesado, es posible que desee echar un vistazo a otros lenguajes orientados a objetos, que hacen aplicar propiedades, tales como C # o Delphi. La sintaxis es realmente fácil:
public interface IFoo
{
int Bar { get; }
}
public class Foo : IFoo
{
public int Bar { get; set; }
}
Sí, eso es todo lo que hay que hacer. Importante: Estos no son campos, la "barra int" en la Fooclase es una propiedad automática , y el compilador está haciendo exactamente lo que acabo de describir anteriormente: generar automáticamente captadores y establecedores (así como el campo del miembro de respaldo).
Entonces, para recapitular la respuesta a tu pregunta:
- Las interfaces requieren métodos porque su propósito completo no es contener ningún dato;
- La razón por la que no existe un azúcar sintáctico para facilitar que una clase implemente una interfaz es simplemente que los diseñadores de Java no lo harán, y en este momento, la compatibilidad con versiones anteriores es un problema. Los diseñadores de idiomas hacen este tipo de elecciones; solo tendrás que lidiar con eso o cambiar.