2009-02-21 11 views
15

C# 'da, aynı yöntemle iki temel arabiriminiz varsa (örneğin, F()), farklı uygulama gerçekleştirmek için açık uygulamayı kullanabilirsiniz. F() için. Bu, mevcut bakış açısına karşılık gelen nesneyi farklı şekilde ele almanızı sağlar: IMyInterface1 veya IMyInterface2 olarak. Java'da bu mümkün mü?Java'da mevcut arabirimin C# "açık uygulaması" mı?

cevap

25

Hayır, Java'da C# 'nin açık arabirim uygulaması gibi bir şey yok.

Artı tarafında, Java'nın kovariant dönüş türleri vardır, bu nedenle, arabirim belirttiğinden daha güçlü bir şekilde yazılan bir uygulama sağlamak istiyorsanız, sorun yok.

interface Foo 
{ 
    Object getBar(); 
} 

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

C# o izin vermeyeceğini - ve çevresinde yollarından biri genellikle arayüz uygulaması tarafından çağrılan daha spesifik bir kamu yöntemi (açıkça arabirimini uygulamak ve daha sonra olması genellikle: Örneğin, bu gayet).

0

Yalnızca yöntemler aşırı yüklenmişse bunu yapabilirsiniz. Farklı şeyler yapması beklenen iki yönteme sahipseniz, bunların farklı isimleri IMHO olmalıdır.

-17

Hayır ve hiçbir zaman Java'da bulunmamalıdır. İyi tasarımla uğraşamayan insanlara atmak sadece bir kemik. Bir arabirimin açık olarak uygulanması kesinlikle gerekli olmamalı veya kullanılmamalıdır. Bu, çözmeye çalıştığı sorunu çözmek için daha iyi yollar vardır.

+0

ayrıca özel miras sadece "iyi tasarımı ile rahatsız olamaz insanlar" için olduğunu inanıyor musunuz? Java'dan eksik olan başka bir kullanışlı OOP özelliği. –

+0

Java'da asla hiçbir zaman Java'da olmayacak. Delegelerin asla Java'da bulunmayacağı .. google. Java'da hiç yapılmayan delegelerin neden bu kadar iyi olduğu hakkında iyi bir yazı var. Bu, onunla yapabileceğiniz iyi şeyleri yapmamanızı sağladığı için kötüdür. Microsoft ve ekosistem bir şey alamadım. – eaglestorm

+1

@ealgestorm, Swing'in bile kendilerini delegeler gibi davranmasını sağlamak için “suistimal” ettiğini fark ettiniz, değil mi? Ayrıca, hemen hemen tüm sorularınızın .NET ile ilgili olduğunu biraz eğlenceli buluyorum. –

3

Java'da anonim arabirim uygulamasıyla benzer efektler elde edebilirsiniz.

örneğe bakın:

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(); 
    } 
}