2012-07-02 27 views
15

Ben duruma geldi: Bir defada iki koşulu tatmin ediliraynı yöntem

public interface Intr { 
    public void m1(); 
} 

public abstract class Abs { 
    public void m1() { 
     System.out.println("Abs.m1()"); 
    } 
    // public abstract void m1(); 
} 

public class A extends Abs implements Intr { 

    @Override 
    public void m1() { 
     // which method am I overriding, well it is Abs.m1() but why? 
     // if method implemented is Abs.m1(), then why I am not getting error for Intr.m1() not implemented. 
    } 

} 
+5

Her ikisini de geçersiz kılıyorsunuz. Sorun ne? –

cevap

24

; yani. Bir uygulama aynı zamanda soyut sınıf gereksinimlerini ve arayüz gereksinimlerini karşılamaktadır. Not: Intr'u başka bir devralma zincirinde kullanmadığınız sürece, buna ihtiyacınız yoktur. Ayrıca, implements Intr'u soyut sınıf tanımına taşımak mantıklı olabilir.

5

Yalnızca başka bir sınıfta tanımlanan yöntemleri geçersiz kılabilirsiniz. Bir arabirimde bildirilen yöntemler yalnızca uygulanır. Bu ayrım, Java'da çoklu kalıtım sorununu çözmek için var. Bir sınıf sadece bir ana sınıfı uzatabilir, bu nedenle super numarasına yapılan çağrılar belirsizlik olmadan çözülür. Ancak sınıflar, hepsi aynı yöntemi açıklayabilecek çeşitli arayüzleri uygulayabilir. Arayüzlerin "sahip olması gerekenler" in bir listesi olarak düşünülmesi en iyisidir: Comparable olarak kabul etmek için, cluss'unuzun compareTo() yöntemine sahip olması gerekir, ancak nereden geldiğini veya başka hangi arabirimlerin aynı yöntemi gerektirdiğini fark etmez.

Teknik açıdan Abs.m1()'u geçersiz kıldınız ve Intr.m1()'u bir kez düşürdünüz. Bu çok iyi olacağını

Not:

public class B extends Abs implements Intr { 

    //m1() is inherited from Abs, so there's no need to override it to satisfy the interface 
} 
+0

Arayüzden bir yöntem uygulamamız durumunda bile @Override

+2

yazıyoruz? Bu sadece belirli bir hata türünü bulmayı kolaylaştıran bir ek açıklamadır, ancak dilin bir parçası değildir. Dilerseniz dilediğiniz zaman '@ Geçersiz Kıl 'açıklamasını kullanmadan yöntemleri geçersiz kılabilirsiniz. – biziclop

+0

Niçin geçersiz kıldığımız ve geçersiz kılmayan yöntemleri geçersiz kıldığımızı ve neden uygulamadığımızı merak ediyorum ... – Trejkaz

0

@Override hiçbir fark Arayüz veya soyut üst sınıf ile yöntemini geçersiz garantiler. Yani geçersiz kılma ile hata yok.

Diğer taraftan Arabirim yöntemi, Arabirim sözleşmesi için yeterli olan süper sınıfta da uygulanır.

0

Burada hem arabirim hem de soyut sınıf aynı yönteme sahiptir.

Tek bir sınıf isminiz var, sınıf ve uygulama arabirimini genişletiyor ve sınıfına merhaba sınıfında meth1 yöntemini geçersiz kılıyorsunuz ve doğru bir şekilde derlenmiyor ve herhangi bir hata verilemiyor ancak onu hangi sınıf yöntemiyle tanımlayamıyorsunuz? soyut sınıf veya arayüz gibi geçersiz kılınır.

Bu, çalışma sınıfı polimorfizmidir, soyut sınıf ve arabirim nesnesi oluşturamazsınız ancak bunun referans değişkeni oluşturabilirsiniz. Buradaki çözüm, derleme zamanında gerçek çalışma zamanındaki geçersiz kılma işlemini tanımlayamaz.

interface hi 
{ 
    public void meth1(); 
} 
abstract class Hullo 
{ 
    public abstract void meth1(); 
} 
public class Hello extends Hullo implements hi 
{ 
    public void meth1(){ 
     System.out.println("hello"); 
    } 
     hi h= new Hello(); 
     h.meth1();//its means interface method is override. and its decide when we call method. 
     hullo hu= new Hello(); 
     hu.meth1();//its means abstract class method is override. 
} 
İlgili konular