¿Cómo puedo garantizar que un tipo implemente una interfaz en tiempo de compilación? La forma típica de hacerlo es no asignar las interfaces de soporte de ese tipo; sin embargo, tengo varios tipos que solo se convierten dinámicamente. En tiempo de ejecución, esto genera mensajes de error muy bruscos, sin los mejores diagnósticos dados para los errores de tiempo de compilación. También es muy inconveniente encontrar en tiempo de ejecución que los tipos que esperaba soportan interfaces, de hecho no.Asegúrese de que un tipo implementa una interfaz en tiempo de compilación en Ir
Respuesta
Suponiendo que la pregunta es sobre Go, p.
var _ foo.RequiredInterface = myType{} // or &myType{} or [&]myType if scalar
como TLD lo comprobará en tiempo de compilación.
EDIT: s/[*]/&/
Edit2: s/maniquí/_ /, gracias Atom
Puede escribir '_' en lugar de' dummy'. –
Estoy intrigado por su notación de edición sed-style. – Matt
De esta manera:
http://play.golang.org/p/57Vq0z1hq0
package main
import(
"fmt"
)
type Test int
func(t *Test) SayHello() {
fmt.Println("Hello");
}
type Saluter interface{
SayHello()
SayBye()
}
func main() {
t := Saluter(new(Test))
t.SayHello()
}
cederá :
prog.go:19: cannot convert new(Test) (type *Test) to type Saluter:
*Test does not implement Saluter (missing SayBye method)
No me gusta la idea de hacer errores de lanzamiento del compilador poniendo líneas ficticias en el código principal. Esa es una solución inteligente que funciona, pero prefiero escribir una prueba para este propósito.
Suponiendo que tenemos:
type Intfc interface { Func() }
type Typ int
func (t Typ) Func() {}
Esta prueba se asegura de Typ
implementa Intfc
:
package main
import (
"reflect"
"testing"
)
func TestTypes(t *testing.T) {
var interfaces struct {
intfc Intfc
}
var typ Typ
v := reflect.ValueOf(interfaces)
testType(t, reflect.TypeOf(typ), v.Field(0).Type())
}
// testType checks if type t1 implements interface t2
func testType(t *testing.T, t1, t2 reflect.Type) {
if !t1.Implements(t2) {
t.Errorf("%v does not implement %v", t1, t2)
}
}
Puede comprobar todos sus tipos y las interfaces añadiéndolos a TestTypes
función. Escritura de pruebas para Go se introduce here.
Eh, no. Escribir un caso de prueba utilizando la reflexión solo para evitar la comprobación estática de un tipo de compilador no es aconsejable. – zzzz
¿Qué pasa con esto? – Mostafa
Go es un lenguaje estáticamente tipado. ¿Qué pasa con una verificación de tipo estática? La verificación dinámica de tipos es razonable si no se puede verificar el tipo estático, en mi humilde opinión. – zzzz
package main
import (
"fmt"
)
type Sayer interface {
Say()
}
type Person struct {
Name string
}
func(this *Person) Say() {
fmt.Println("I am", this.Name)
}
func main() {
person := &Person{"polaris"}
Test(person)
}
func Test(i interface{}) {
//!!here ,judge i implement Sayer
if sayer, ok := i.(Sayer); ok {
sayer.Say()
}
}
El ejemplo de código está aquí: http://play.golang.org/p/22bgbYVV6q
En el lenguaje Go no hay "implementos" declaración de diseño. La única forma de pedirle al compilador que verifique que el tipo T implementa la interfaz I al intentar una asignación (sí, una ficticia :). Tenga en cuenta que Go lang diferencia los métodos declarados en la estructura y el puntero, , use el derecho en la verificación de asignación.
type T struct{}
var _ I = T{} // Verify that T implements I.
var _ I = (*T)(nil) // Verify that *T implements I.
Leer FAQ para más detalles Why doesn't Go have "implements" declarations?
[http://play.golang.org/p/UNXt7MlmX8](http://play.golang.org/p/UNXt7MlmX8) para resaltar la diferencia entre los controles de asignación de puntero y estructura –
- 1. Java - Asegúrese de que un objeto implementa una interfaz
- 2. Crear tipo que implementa la interfaz interna
- 3. ¿Cómo se especifica un parámetro de tipo que NO implementa una interfaz en particular?
- 4. Tipo de especialización en tiempo de compilación
- 5. ¿Cómo sé si una interfaz se implementa directamente en un tipo que ignora las heredadas?
- 6. Force Singleton Pattern en una clase que implementa una interfaz
- 7. Subclases de una clase que implementa una interfaz genérica
- 8. Función que implementa la interfaz
- 9. Hay un motor de JavaScript (tiempo de ejecución) que no implementa la interfaz de temporizadores
- 10. no puede compilar una clase que implementa una interfaz sin parámetro de tipo
- 11. Generación de una clase JAXB que implementa una interfaz
- 12. Generics: heredan de una clase abstracta que implementa una interfaz
- 13. Interfaces C#: ¿Es posible hacer referencia al tipo que implementa la interfaz dentro de la interfaz?
- 14. ¿Cómo se implementa una interfaz en IronPython?
- 15. ¿Cómo defino una clase genérica que implementa una interfaz y restringe el parámetro de tipo?
- 16. Prueba si un objeto implementa una interfaz
- 17. Cómo comprobar que implementa objeto de interfaz
- 18. Tiempo de compilación compruebe si una clase base es "interfaz"
- 19. En Delphi es posible vincular una interfaz a un objeto que no lo implementa
- 20. Comprobación de la implementación de la interfaz en tiempo de compilación en C++
- 21. Registro de tipo C++ en tiempo de compilación truco
- 22. Reflection.Emit para crear una clase que implementa una interfaz
- 23. Determinación del tipo de tiempo de compilación en C++
- 24. ID de tipo C++ en tiempo de compilación
- 25. ¿Por qué no hay error de compilación cuando lanzo una clase a una interfaz que no implementa?
- 26. Cambiar el tipo de propiedad en la clase que implementa la interfaz con la propiedad tipo de objeto
- 27. Crear tipo genérico con interfaz genérica en tiempo de ejecución
- 28. Generando una advertencia de tiempo de compilación personalizada C#
- 29. Cómo averiguar el tipo integral más pequeño que puede representar un número, en tiempo de compilación
- 30. Ir a la definición en concreto tipo
¿En qué idioma? – EJP
@EJP: debe ser _go_, el idioma de Google – themarcuz