CodeGym/Java Blogu/Rastgele/Java'da Yöntemi Geçersiz Kılma
John Squirrels
Seviye
San Francisco

Java'da Yöntemi Geçersiz Kılma

grupta yayınlandı
MERHABA! Zaten Java yöntemlerini kullanıyorsunuz ve onlar hakkında çok şey biliyorsunuz. Muhtemelen bir sınıfın aynı ada ancak farklı parametrelere sahip birçok yöntemi olduğu durumla karşılaşmışsınızdır. Bu durumlarda metot aşırı yükleme kullandığımızı hatırlayacaksınız. Bugün başka bir durumu ele alıyoruz. Tek bir paylaşılan yöntemimiz olduğunu, ancak farklı sınıflarda farklı şeyler yapması gerektiğini hayal edin. Bu davranışı nasıl uygularız? Anlamak için, hayvanları temsil eden bir Animal ebeveyn sınıfını ele alalım ve bunun içinde bir konuşma yöntemi oluşturacağız :
public class Animal {

   public void speak() {

       System.out.println("Hello!");
   }
}
Programı yazmaya daha yeni başlamış olsak da, muhtemelen potansiyel bir sorun görüyorsunuz: Dünyada çok sayıda hayvan var ve hepsi farklı 'konuşuyor': kediler miyavlıyor, ördekler vaklıyor ve yılanlar tıslıyor. Yöntem geçersiz kılma nasıl çalışır - 2Amacımız basit: Bir sürü konuşma yöntemi oluşturmaktan kaçının. Miyavlamak için bir catSpeak() yöntemi, tıslama için bir snakeSpeak() yöntemi oluşturmak yerine , talk() işlevini çağırmak istiyoruz.yöntemi ve yılanın tıslamasını, kedinin miyavlamasını ve köpeğin havlamasını sağlayın. Yöntem geçersiz kılmayı kullanarak bunu kolayca başarabiliriz. Vikipedi, 'geçersiz kılma' teriminin şu açıklamasını verir: Nesne yönelimli programlamada yöntem geçersiz kılma, bir alt sınıfın veya alt sınıfın, üst sınıflarından biri tarafından zaten sağlanan bir yöntemin belirli bir uygulamasını sağlamasına izin veren bir dil özelliğidir. ebeveyn sınıfları Bu esasen doğrudur. Yöntem geçersiz kılma, üst sınıfın bazı yöntemlerini alıp her alt sınıfa kendi uygulamanızı yazmanıza olanak tanır. Yeni uygulama, ebeveynin çocuk sınıfındaki uygulamasının yerini alır. Bunun bir örnekte nasıl göründüğüne bakalım. Animal sınıfımızı devralan 4 sınıf oluşturun :
public class Bear extends Animal {
   @Override
   public void speak() {
       System.out.println("Growl!");
   }
}
public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void speak() {
       System.out.println("Woof!");
   }
}


public class Snake extends Animal {

   @Override
   public void speak() {
       System.out.println("Hiss!");
   }
}
"İşte gelecek için küçük bir yaşam tüyosu: üst sınıfın yöntemlerini geçersiz kılmak için IntelliJ IDE'de alt sınıfın koduna gidin, Ctrl+O'ya tıklayın ve menüden "Yöntemleri geçersiz kıl..." seçeneğini seçin. Kısayol tuşlarını kullanmaya alışın en başından — programları daha hızlı yazmanıza yardımcı olacak! İhtiyacımız olan davranışı belirtmek için birkaç şey yaptık:
  1. Her alt sınıfta, üst sınıfın yöntemiyle aynı ada sahip bir yöntem oluşturduk.

  2. Derleyiciye, yöntemi üst sınıftakiyle aynı şekilde adlandırmanın tesadüf olmadığını söyledik: davranışını geçersiz kılmak istiyoruz. Bunu derleyiciye iletmek için, yöntemin üzerine @Override açıklamasını koyuyoruz.
    Bir yöntemin üzerine yerleştirildiğinde, @Override ek açıklaması derleyiciyi (ve kodunuzu okuyan programcıları) bilgilendirir: 'Her şey yolunda. Bu bir hata değil. Ben unutkan değilim. Böyle bir yöntemin zaten var olduğunun farkındayım ve onu geçersiz kılmak istiyorum'.

  3. Her çocuk sınıfı için ihtiyacımız olan uygulamayı yazdık. Talk() yöntemi çağrıldığında , bir yılan tıslamalı, bir ayı hırlamalı vb.
Bunun bir programda nasıl çalıştığını görelim:
public class Main {

   public static void main(String[] args) {

       Animal animal1 = new Dog();
       Animal animal2 = new Cat();
       Animal animal3 = new Bear();
       Animal animal4 = new Snake();

       animal1.speak();
       animal2.speak();
       animal3.speak();
       animal4.speak();
   }
}
Konsol çıktısı:
Woof!
Meow!
Growl!
Hiss!
Harika! Her şey olması gerektiği gibi çalışıyor! Animal ebeveyn sınıfının nesnelerini saklayan 4 referans değişkeni yarattık ve bunlara 4 farklı alt sınıfın örneklerini atadık. Sonuç olarak, her nesne kendi davranışını sergiler. Her alt sınıf için geçersiz kılınan talk() yöntemi, Animal sınıfındaki (yalnızca 'Merhaba!' görüntüleyen) 'yerel' talk() yönteminin yerini aldı. Geçersiz kılmanın birkaç sınırlaması vardır: Yöntem geçersiz kılma nasıl çalışır - 3
  1. Geçersiz kılınan yöntem, ana yöntemle aynı parametrelere sahip olmalıdır.

    Üst sınıfın talk yönteminde bir String parametresi varsa, alt sınıftaki geçersiz kılınan yöntemin de bir String parametresi olmalıdır. Aksi takdirde, derleyici bir hata üretecektir:

    public class Animal {
    
       public void speak(String s) {
    
           System.out.println("Hello! " + s);
       }
    }
    
    public class Cat extends Animal {
    
       @Override // Error!
       public void speak() {
           System.out.println("Meow!");
       }
    }

  2. Geçersiz kılınan yöntem, ana yöntemle aynı dönüş türüne sahip olmalıdır.

    Aksi takdirde, bir derleyici hatası alırız:

    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    
    public class Cat extends Animal {
    
       @Override
       public String speak() {         // Error!
           System.out.println("Meow!");
           return "Meow!";
       }
    }

  3. Geçersiz kılınan yöntemdeki erişim değiştiricisi de 'orijinal' yöntemle aynı olmalıdır:

    public class Animal {
    
          public void speak() {
    
                System.out.println("Hello!");
          }
    }
    
    public class Cat extends Animal {
    
           @Override
           private void speak() {      // Error!
               System.out.println("Meow!");
           }
    }
Java'da yöntem geçersiz kılma, polimorfizmi uygulamanın bir yoludur (geçen derste açıkladığımız OOP ilkesi). Bu, ana avantajının daha önce tartıştığımız aynı esneklik olduğu anlamına gelir. Her biri belirli bir davranışa sahip (köpek havlaması, kedi miyavlaması) olan basit ve mantıklı bir sınıf sistemi oluşturabiliriz ve ortak bir arabirimle — bir sürü yöntem yerine hepsi için tek bir talk () yöntemi, örneğin dogSpeak() , talkCat () vb.
Yorumlar
  • Popüler
  • Yeni
  • Eskimiş
Yorum bırakmak için giriş yapmalısınız
Bu sayfada henüz yorum yok