En Go Language Tutorial, explican cómo funcionan las interfaces:
Ir no tiene clases. Sin embargo, puede definir métodos en tipos de estructura. El receptor del método aparece en su propia lista de argumentos entre la palabra clave func y el nombre del método.
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
Un tipo de interfaz se define mediante un conjunto de métodos. Un valor de tipo de interfaz puede contener cualquier valor que implemente esos métodos.
Esta es la única forma de crear una interfaz en Go. Google explica además que:
Un tipo implementa una interfaz mediante la implementación de los métodos. No existe una declaración explícita de intenciones [es decir,
interface
declaraciones].Las interfaces implícitas desacoplan los paquetes de implementación de los paquetes que definen las interfaces: ninguno depende del otro.
También fomenta la definición de interfaces precisas, ya que no tiene que encontrar todas las implementaciones y etiquetarlas con el nuevo nombre de interfaz.
Todo esto suena sospechosamente como métodos de extensión en C # , excepto que los métodos en Go son implacablemente polimórficos; operarán en cualquier tipo que los implemente.
Google afirma que esto fomenta el desarrollo rápido, pero ¿por qué? ¿Renuncias a algo alejándote de las interfaces explícitas en C #? ¿Podrían los métodos de extensión en C # permitirle obtener algunos de los beneficios que tienen las interfaces Go en C #?
fuente
Respuestas:
No veo los métodos de extensión y las interfaces implícitas como iguales en absoluto.
Primero hablemos con un propósito.
Los métodos de extensión existen como un azúcar sintáctico específicamente para darle la capacidad de usar un método como si fuera un miembro de un objeto, sin tener acceso a las partes internas de ese objeto. Sin métodos de extensión puede hacer exactamente lo mismo, simplemente no obtiene la sintaxis agradable
someObjectYouCantChange.YourMethod()
y más bien tiene que llamarYourMethod(someObjectYouCantChange)
.Sin embargo, el propósito de las interfaces implícitas es que pueda implementar una interfaz en un objeto que no tiene acceso para cambiar. Esto le brinda la capacidad de crear una relación polimórfica entre cualquier objeto que escriba usted mismo y cualquier objeto del que no tenga acceso a las partes internas.
Ahora hablemos de las consecuencias.
Los métodos de extensión realmente no tienen ninguno, esto está perfectamente en línea con las despiadadas restricciones de seguridad que .NET intenta usar para ayudar en distintas perspectivas en un modelo (la perspectiva desde adentro, afuera, heredero y vecino). La consecuencia es solo algo de placer sintáctico.
Las consecuencias de las interfaces implícitas son algunas cosas.
fuente
IEnumerable
yIQueryable
. Si bien podría fingir esto constatic
métodos en una clase de utilidad, sería torpe.