SORU
10 Mayıs 2010, PAZARTESİ


Aynı yöntem ile bir sınıfta iki arabirim uygulamak. Arabirim yöntemi geçersiz kılınır?

Aynı yöntem adları ve imzaları ile iki arayüz. Ama derleyici arayüzü olan tanımlayacak o zaman nasıl tek bir sınıf tarafından uygulanan?

Ex:

interface A{
  int f();
}

interface B{
  int f();
}

class Test implements A, B{   
  public static void main(String... args) throws Exception{   

  }

  @Override
  public int f() {  // from which interface A or B
    return 0;
  }
}   

CEVAP
14 Mayıs 2010, Cuma


Eğer bir tür İki arayüzleri, ve interface aynı olan bir yöntem tanımlamak her imza uygular, o an geçerli olan tek bir yöntem yoktur, ve ayırt edilebilir değildir. Diyelim, iki yöntemden çelişkili dönüş türleri varsa, o zaman derleme bir hata olacaktır. Bu genel kural, miras, yöntem geçersiz kılma, gizleme ve bildirimleri ve geçerlidir ayrıca Olası çatışma sadece 2 arasında kalıtsal interface yöntem, aynı zamanda bir interface süper class yöntem, hatta sadece çatışmalar nedeniyle tip silme jenerik.


Uyumluluk örneği

İşte size bir örnek burada var interface Gift, Bir present() yöntem (hediyeleri takdim), ve aynı zamanda bir interface Guest, aynı zamanda bir present() yöntem (olarak, konuk mevcut değil, yok).

Presentable johnny Gift Guest.

public class InterfaceTest {
    interface Gift  { void present(); }
    interface Guest { void present(); }

    interface Presentable extends Gift, Guest { }

    public static void main(String[] args) {
        Presentable johnny = new Presentable() {
            @Override public void present() {
                System.out.println("Heeeereee's Johnny!!!");
            }
        };
        johnny.present();                     // "Heeeereee's Johnny!!!"

        ((Gift) johnny).present();            // "Heeeereee's Johnny!!!"
        ((Guest) johnny).present();           // "Heeeereee's Johnny!!!"

        Gift johnnyAsGift = (Gift) johnny;
        johnnyAsGift.present();               // "Heeeereee's Johnny!!!"

        Guest johnnyAsGuest = (Guest) johnny;
        johnnyAsGuest.present();              // "Heeeereee's Johnny!!!"
    }
}

Yukarıdaki Pasajı derler ve çalıştırır.

Unutmayınsadece bir tane var@Override!! gerekli!. Bu Gift.present() Guest.present() çünkü "@Overrideeşdeğer" (JLS 8.4.2).

Böylece, johnnysadece tek bir uygulaması vardırpresent() ve ** 24, orada Gift bir ya johnny, nasıl davrandığın önemli değil olur çağırmak için tek yöntem.


Uyumsuzluk örneği

İşte iki devralınan yöntemleri @Overrideeşdeğer OLMAYAN bir örnek:

public class InterfaceTest {
    interface Gift  { void present(); }
    interface Guest { boolean present(); }

    interface Presentable extends Gift, Guest { } // DOES NOT COMPILE!!!
    // "types InterfaceTest.Guest and InterfaceTest.Gift are incompatible;
    //  both define present(), but with unrelated return types"
}

Bu da interface bir üye devralmasını üye bildirimleri itaat genel bir kural gerektiğini yineledi. Biz Gift Guest uyumsuz dönüş türleri ile present() define var burada: bir void boolean. Yapamazsın aynı sebeple bir yazın void present() boolean present(), bu örnek, bir derleme hatası oluşur.


Özet

@Overrideeşdeğer yöntemler miras, yöntem geçersiz kılma ve saklanan her zamanki şartlara tabi olabilir. Onlar beri@Overrideeşdeğer, etkili bir şekilde uygulamak için tek bir yöntem yoktur, ve bu nedenle ayırt etmek için bir şey yok/seçin.

Derleyici @Overrideeşdeğer olduğu belirlenir belirlenmez sonra, aynı yöntem, çünkü onlar için arayüz tanımanızı yok.

Potansiyel uyumsuzlukları çözmek zor bir görev olabilir, ama bu tamamen başka bir konu.

Referanslar

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dive In

    Dive In

    17 Temmuz 2013
  • Friday Night Cranks

    Friday Night

    27 Mayıs 2007
  • MagicofRahat

    MagicofRahat

    13 Temmuz 2007