2009-02-21 8 views

Respuesta

25

No, no hay nada como la implementación de interfaz explícita de C# en Java.

En el lado positivo, Java tiene tipos de retorno covariantes, por lo que si desea proporcionar una implementación más fuertemente tipada de la especificada por la interfaz, está bien. Por ejemplo, esto está muy bien:

interface Foo 
{ 
    Object getBar(); 
} 

public class Test implements Foo 
{ 
    @Override 
    public String getBar() 
    { 
     return "hi"; 
    } 
} 

C# no permitiría que - y una de las formas de hacerlo es por lo general para implementar la interfaz de forma explícita y luego tener un método público más específico (generalmente llamado por la implementación de la interfaz)

0

Solo puede hacer esto si los métodos están sobrecargados. Si tiene dos métodos que se espera que hagan cosas diferentes, deben tener nombres diferentes en mi humilde opinión.

-17

No, y nunca debería estar presente en Java. Es solo otro hueso para tirarle a la gente a la que no se le puede molestar con un buen diseño.

La implementación explícita de una interfaz nunca debería ser necesaria ni utilizada. Hay mejores formas de resolver el problema que esto intenta resolver.

+0

¿Usted también cree que la herencia privada es sólo para las personas que "no puede ser molestado con un buen diseño"? Esa es otra capacidad OOP útil que falta en Java. –

+0

Nunca estará en Java por la misma razón que los delegados nunca estarán en Java ... google it. Hay un buen artículo sobre por qué los delegados nunca hicieron en Java y esto es similar. Es malo por lo que te permite no hacer las cosas buenas que puedes hacer con él. Algo que Microsoft y su ecosistema no obtienen. – eaglestorm

+1

@ealgestorm, te das cuenta de que incluso Swing "abusa" de los objetos para que se comporten como delegados, ¿verdad? Además, me parece un poco divertido que casi todas tus preguntas estén relacionadas con .NET. –

3

Puede lograr un efecto similar utilizando el mecanismo de implementación de interfaz anónima en Java.

Ver ejemplo:

interface Foo { 

    void f(); 
} 

interface Bar { 

    void f(); 
} 

public class Test { 

    private String foo = "foo", bar = "bar"; 

    Foo getFoo() { 
     return new Foo() { 

      @Override 
      public void f() { 
       System.out.println(foo); 
      } 
     }; 
    } 

    Bar getBar() { 
     return new Bar() { 

      @Override 
      public void f() { 
       System.out.println(bar); 
      } 
     }; 
    } 

    public static void main(String... args) { 
     Test test = new Test(); 
     test.getFoo().f(); 
     test.getBar().f(); 
    } 
} 
Cuestiones relacionadas