1. Ortak temel sınıf

Bugün ilginç konulardan oluşan bir smorgasbord'un tadını çıkaracağız. Satranç taşlarını temsil eden tüm sınıfları basitleştirmek için temel sınıfı tanıttığımız zamanı hatırlıyor musunuz ? umarım öyledir 🙂ChessItem

draw()Şimdi, her bir parçanın ekranda çizilmesini sağlayan bir yöntemi olduğunu hayal edin . Yöntemi çağırırsınız draw()ve parça kendisini mevcut koordinatlarında çizer. Bu yöntemi temel sınıfa taşımak uygun olacaktır.

Metot draw()ChessItem temel sınıfındaysa, onu parça sınıflarında geçersiz kılabilir ve şöyle zarif bir kod yazabiliriz:

class ChessBoard
{
   public void drawAllChessItems()
   {
      // Add the pieces to the list
      ArrayList<ChessItem> items = new ArrayList<ChessItem>();
      items.add(new King());
      items.add(new Queen());
      items.add(new Bishop());

      // Draw them regardless of their type
      for(ChessItem item: items)
      {
         item.draw();
      }
   }
}

Temel sınıfı tanıtarak ChessItem, kodu büyük ölçüde basitleştirebildik: her sınıfın yöntemlerini ayrı ayrı çağırmaya gerek yok, tüm nesneleri kolayca tek bir koleksiyonda saklayabiliriz, vb.

Ancak burada ilginç bir soru var: draw()doğrudan sınıfta açıklanan yöntem ChessItemekranda ne çizmelidir? Sonuçta satrançta böyle bir taş yok yani çizilecek bir şey yok.

Bu kesinlikle doğru. Dahası, ChessItemdoğrudan nesne yaratmanın bir anlamı yoktur. Bu bir satranç taşı değil, daha ziyade sadece bir soyutlama - bizim rahatlığımız için yarattığımız bir sınıf. OOP'de soyutlama şu şekilde çalışır : önemli verileri ve yöntemleri (tüm parçalar tarafından paylaşılanlar) bir temel sınıfa taşırız ve farklılıklarını ayrı alt sınıflarda tutarız.


2. Soyut dersler

Soyut sınıflar

Bu tür durumlar için Java'nın özel bir sınıfı vardır: soyut sınıf . Programcıların benzer sınıflarla çalışmasını kolaylaştırmak ve içlerinde yinelenen kod miktarını azaltmak için tasarlanmıştır.

İşte soyut sınıflar hakkında bilinmesi gereken üç şey.

Uygulamasız yöntem

Soyut bir sınıf, uygulama olmadan bir yöntem bildirimine sahip olabilir. Yöntemi soyut yapan da tam olarak budur. Yöntem gövdesi basitçe bir noktalı virgülle değiştirilir. Ve metodun adından önce de abstractanahtar kelimeyi yazıyoruz. Örnek:

public abstract class ChessItem
{
   public int x, y; // Coordinates
   private int value; // The piece's value
   public int getValue() // Ordinary method that returns value field
   {
      return value;
   }

   public abstract void draw(); // Abstract method. The implementation is missing.
}

Soyut sınıf

Uygulaması olmayan her yöntem, abstract anahtar sözcüğü ile işaretlenir. Bir sınıfın tek bir soyut yöntemi varsa, sınıf ayrıca anahtar kelime ile işaretlenir abstract.

Nesnelerin oluşturulmasını yasaklamak

Soyut bir sınıfın nesnelerini yaratamazsınız . Böyle bir kod basitçe derlenmez.

kod Tanım
ChessItem item = new ChessItem();
item.draw();
Bu kod derlenmiyor :
ChessItem item = new Queen();
item.draw();
Ama bunu yapabilirsin

Soyut bir sınıfı devralmak

Eğer sınıfınız soyut bir sınıfı miras alıyorsa, o zaman miras alınan tüm soyut yöntemleri geçersiz kılmanız gerekir, yani onlar için bir uygulama yazmanız gerekir. Aksi takdirde, sınıfınızın kendisinin de soyut olarak bildirilmesi gerekecektir.

Bir sınıfın doğrudan içinde bildirilen veya bir üst sınıftan miras alınan bir uygulanmamış yöntemi bile varsa , sınıf soyut olarak kabul edilir.

Ve tüm bunlar neden gerekli? Soyut sınıflara neden ihtiyaç duyulur? Bunun yerine sıradan olanları kullanmak mümkün değil mi? Ve soyut yöntemler yerine, yöntem gövdesi olarak iki boş süslü parantez yazamaz mıyız?

Yapabiliriz. Ancak bu kısıtlamalar değiştiriciye benzer private. Diğer programcıların verilere doğrudan erişmesini kasıtlı olarak engellemek ve sınıflarını yazarken onları yalnızca genel yöntemlerimizi kullanmaya zorlamak için private anahtar sözcüğünü kullanıyoruz.

Soyut sınıflarda da durum aynıdır. Soyut bir sınıfın yazarı, sınıfın nesnelerinin yaratılmasını istemez. Bunun yerine yazar, soyut yöntemlerin soyut sınıftan miras alınmasını ve ardından geçersiz kılınmasını bekler.

Bu yaklaşımın avantajı büyük projelerde kolayca görülür. Ne kadar çok sınıfınız varsa, rollerini o kadar net bir şekilde tanımlamanız gerekir. Bu yaklaşımın faydasını yakın gelecekte göreceksiniz. Her şey bundan geçer.