"Merhaba Amigo! Büyüleyici yeni bir konumuz var."

"Bugün sadece büyüleyici konuların olduğu bir gün!"

"Neden sana teşekkür edeyim!"

"Rica ederim."

" Satranç taşları için tüm sınıfları basitleştirmek üzere ChessItem temel sınıfını tanıttığımız zamanı hatırlıyor musunuz ?"

"Evet."

"Şimdi her parçanın, parçanın ekranda görüntülenmesini sağlayan bir yöntemi olduğunu hayal edin. Yöntemi çağırıyorsunuz ve parça kendisini mevcut koordinatlarında çiziyor. Bu yöntemi temel sınıfa taşımak yararlı olur mu?"

"Evet." Polimorfizmi öğrendikten sonra, türü ne olursa olsun tüm parçalar için render yöntemini çağırabilecektim. Bunun gibi bir şey:"

Örneğin:
class ChessBoard
{
  public void drawAllChessItems()
  {
  //draw them regardless of their type.
  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();
  }
 }
}

"Aferin. Kesinlikle. ChessItem sınıfının çizim yöntemiyle ne yapılabilir?"

"Bilmiyorum. Satrançta böyle bir taş yoktur. Bu da görsel temsili olmadığı anlamına gelir."

"Kesinlikle. Ve bir ChessItem nesnesi yaratmanın bir anlamı yok. Böyle bir satranç taşı yok. Bu yalnızca bir soyutlama - kolaylık olması için yaptığımız bir sınıf. OOP'de soyutlama böyle çalışır: tüm önemli (paylaşılan) nesneleri taşıdık. tüm taşlara göre) verileri ve yöntemleri bir temel sınıfa dönüştürdük , ancak belirli satranç taşlarına karşılık gelen sınıflardaki farklılıklarını koruduk."

Java'nın bunun için özel bir sınıf türü vardır: abstract class . Soyut sınıflar hakkında hatırlanması gereken üç şey var.

1) Soyut bir sınıf, yöntemleri uygulamadan ilan edebilir. Böyle bir yönteme soyut yöntem denir.

Örneğin:
public abstract class ChessItem
{
 public int x, y; //coordinates
 private int value; //the piece's "value"

 public int getValue() //an ordinary method, returns value
 {
   return value;
 }

 public abstract void draw(); //abstract method. There is no implementation.

}

2) Soyut bir yöntem, abstract anahtar sözcüğü ile işaretlenir .

Bir sınıfın tek bir soyut yöntemi varsa, o zaman sınıf da abstract ile işaretlenir .

3) Soyut bir sınıfın nesnelerini oluşturamazsınız. Bunu yapmaya çalışan kod basitçe derlenmeyecektir.

java kodu Tanım
ChessItem item = new ChessItem();
item.draw();
Bu kod derlenmeyecek.
ChessItem item = new Queen();
item.draw();
Ama bunu yapabilirsin.

4) Eğer sınıfınız soyut bir sınıfı miras alıyorsa, miras alınan tüm soyut yöntemleri geçersiz kılmanız gerekir, yani onları uygulamanız gerekir. Aksi takdirde, sınıfınızın da soyut olarak bildirilmesi gerekecektir. Sınıfın, doğrudan sınıfta bildirilen veya üst sınıftan miras alınan bir uygulanmamış yöntemi bile varsa, sınıf soyut olarak kabul edilir.

"Fakat tüm bunlar neden gerekli? Neden soyut sınıflara ihtiyacımız var? Bunun yerine sıradan sınıflar kullanmak mümkün değil mi? Ve soyut yöntemler yerine, açılıp kapanan süslü parantezlerden oluşan boş uygulamalar oluşturamaz mıyız?"

"Yapabilirsin. Ama bu kısıtlamalar değiştirici gibidir . Değiştiriciyi verilere doğrudan erişimi kasıtlı olarak engellemek için privatekullanırız , böylece diğer programcılar ve onların sınıfları bizim yöntemlerimizi kullanır."privatepublic

Aynısı soyut bir sınıf için de geçerlidir. Sınıfı kim yazdıysa, kimsenin sınıfın örneklerini yaratmasını istemiyor. Aksine, yazar kendi soyut sınıfının soyut yöntemlerinin miras alınmasını ve geçersiz kılınmasını bekler.

"Hayatlarımızı neden bu şekilde karmaşık hale getirmek istediğimizi hala anlamıyorum."

"Bu özelliğin avantajı büyük projelerde bariz. Ne kadar çok sınıfınız varsa, rollerini o kadar net bir şekilde tanımlamanız gerekiyor. Bunu yapmanın avantajını çok yakında göreceksiniz. Bunu herkesin yaşaması gerekiyor."