2008-12-08 33 views

Respuesta

16

Respuesta corta: No

respuesta Ligeramente más largo: Sí, si se hereda múltiples interfaces, y una sola clase base. Dado que esta suele ser la razón para MI (desea implementar múltiples interfaces), por lo general es suficiente. Sin embargo, en esos raros casos en que el MI "real" es útil, .NET evita que lo haga.

+6

La herencia de una interfaz no es realmente la herencia, aunque ... –

+0

@Orion Edwards: ¿cómo no? La herencia define la relación "es una", y las interfaces son una forma de definir qué es un objeto "es". Si heredo ISerializable, digo "Soy un ISerializable", y tratándome como un ISerializable funciona como se espera. –

+0

Además del comentario de @Harper Shelby, una aplicación voluntaria de este tipo de restricción generalmente se considera como una mejor práctica en C++ (en lugar de interfaces, tendríamos clases base abstractas puras). – Richard

4

Es posible de forma restringida en VB.Net de la misma manera que en C#: a través de interfaces. Dado que una interfaz funciona esencialmente con una clase base puramente abstracta, puede heredar de tantas de ellas como sea necesario y de una clase real.

1

Probablemente lo que quieres hacer es realmente composición o agregación (ver here for design pattern). Tal vez estás definiendo un comportamiento. Siempre puede implementar una interfaz SomeInterface en la clase base, tiene un miembro de tipo SomeInterface (que le permite ser cualquier clase que implemente SomeInterface y por lo tanto puede hacer que el código implemente), en el constructor de miembros pasa una referencia a la clase base que lo posee si es necesario (si lo hace, intente agregar otra interfaz para definir las devoluciones de llamada, la clase base lo implementará y la subclase lo tendrá como tipo de variable miembro). Use llamadas a la clase miembro para implementar SomeInterface. De esta forma, el código se implementa en otra clase, lo que hace que sea fácil de mantener, pero no está haciendo herencia múltiple.

La idea detrás de la composición es que un motor no es un automóvil sino un automóvil tiene un motor. El automóvil necesita un motor, pero no necesita saber cómo funciona una unidad de motor completa, sino cómo interactuar con él. Entonces el motor no debería heredar del auto. Pero tener el auto para implementar el motor es una tontería. Entonces el automóvil obtiene un motor como miembro de todo el automóvil, pero como un objeto. El auto tiene un motor como parte de su composición.

Parece que lo que está haciendo es más un comportamiento, como un objeto de pato que tiene un comportamiento de charlatanería, pero los patos de goma son patos pero no graznan, sino chirrían. Por lo tanto, difieren de los objetos de ánade real, pero ambos tienen muchas otras características de pato en común. Entonces quieres tener una interfaz de charlatanería que cada uno implemente de manera diferente. Pero muchos patos graznarán para esta interfaz, por lo que no querrás tener que escribir cuack para cada uno. Ahí es donde usas la composición para implementar la interfaz de comportamiento del charlatanería.

1

Por lo que yo sé VB.net no soporta la herencia múltiple en general, pero se puede llegar a una especie de herencia múltiple mediante el trabajo con los interfaces (usando “Instrumental” en lugar de “hereda”):

Public Class ClassName 
    Implements BaseInterface1, BaseInterface2 

End Class 

Eso funciona bien para las clases pero me gustaría tener una interfaz heredando algunas interfaces base. Algo así:

Public Interface InterfaceName 
    Implements BaseInterface1, BaseInterface2 

End Interface 

Pero la palabra clave "Implements" no está permitida para las interfaces (lo que tiene sentido, por supuesto). He intentado utilizar un tipo de clase abstracta que sé de Java:

Public MustInherit Class InterfaceName 
    Implements BaseInterface1, BaseInterface2 

End Class 

Pero ahora tengo que poner en práctica los métodos definidos de BaseInterface1 y BaseInterface2 dentro de la clase InterfaceName. Pero como InterfaceName también debería ser una interfaz, no quiero tener que implementar estos métodos dentro de esa clase.

En C# se puede hacer eso muy fácil:

public interface InterfaceName: BaseInterface1, BaseInterface2 {}