Menu
Coddy logo textTech

Soyut Metotlar

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 44 / 110.

Soyut metot (abstract method), soyut bir sınıf (abstract class) içinde bildirilen ve gövdesi bulunmayan bir metottur. Metot imzasını tanımlar ancak uygulamanın nasıl olacağını her bir alt sınıfa (subclass) bırakır. Soyut sınıfı genişleten (extend eden) herhangi bir sınıf, tüm soyut metotları geçersiz kılmak (override) zorundadır; aksi takdirde o sınıf da soyut kalacaktır.

abstract class Animal {
  // Soyut metot - gövdesi yok, alt sınıflar tarafından uygulanmalıdır
  String makeSound();

  // Somut metot - bir gövdesi var, tüm alt sınıflar tarafından paylaşılır
  void breathe() {
    print('Breathing...');
  }
}

class Dog extends Animal {
  @override
  String makeSound() {
    return 'Woof!';  // Uygulama sağlanmalıdır
  }
}

class Cat extends Animal {
  @override
  String makeSound() {
    return 'Meow!';  // Farklı uygulama, aynı imza
  }
}

Eğer bir alt sınıf soyut bir metodu uygulamayı unutursa, Dart size bir derleme hatası verir. Asıl amaç budur; soyut metodlar bir sözleşmeyi zorunlu kılar. Her alt sınıfın bu metoda sahip olacağı garanti edilir, böylece soyut türün herhangi bir örneği üzerinde onu güvenle çağırabilirsiniz.

// Soyut türü bir değişken türü olarak kullanabilirsiniz
Animal a = Dog();
print(a.makeSound());  // Hav!

Animal b = Cat();
print(b.makeSound());  // Miyav!

Soyut metotlar, soyut bir sınıftaki somut metotlardan farklıdır. Somut metotların bir gövdesi vardır ve olduğu gibi miras alınırlar. Soyut metotların gövdesi yoktur ve geçersiz kılınmaları gerekir.

Bazı davranışları paylaşırken diğerleri için alt sınıfları kendi tanımlarını yapmaya zorlamak amacıyla her ikisini de aynı soyut sınıfta birleştirebilirsiniz.

ÖzellikSoyut Metot (Abstract Method)Somut Metot (Concrete Method)
Gövdesi var mıHayırEvet
Geçersiz kılınmalı mıEvetHayır
AmaçSözleşmeyi zorunlu kılmakDavranışı paylaşmak
NeredeSadece soyut sınıftaHerhangi bir sınıfta
challenge icon

Görev

Kolay

Soyut metotların işleyişini gösteren bir şekil hesaplayıcı oluşturalım. Her şeklin farklı şekilde uygulaması gereken soyut metotlara sahip bir soyut sınıf tanımlayacak ve ardından bu şekilleri ortak bir arayüz üzerinden kullanacaksınız.

Kodunuzu dört dosyada organize edeceksiniz:

  • shape.dart: final bir color (String) alanına ve bunu başlatan bir yapıcıya (constructor) sahip bir Shape soyut sınıfı tanımlayın. İki soyut metot bildirin: double area() ve double perimeter(). Ayrıca, A [color] shape with area: [area] and perimeter: [perimeter] çıktısını yazdıran somut bir describe() metodu ekleyin. area() ve perimeter() soyut olduğu için, her alt sınıf kendi hesaplamasını sağlayacaktır, ancak describe() metodu geçersiz kılınmadan (override) hepsi için çalışır.
  • circle.dart: Shape sınıfını genişleten bir Circle sınıfı oluşturun. final bir radius (double) alanına sahiptir. Yapıcısı color ve radius alır ve color değerini super'e iletir. area() metodunu 3.14 * radius * radius döndürecek şekilde, perimeter() metodunu ise 2 * 3.14 * radius döndürecek şekilde uygulayın.
  • rectangle.dart: Shape sınıfını genişleten bir Rectangle sınıfı oluşturun. final width ve height (her ikisi de double) alanlarına sahiptir. Yapıcısı color, width ve height alır ve color değerini super'e iletir. area() metodunu width * height döndürecek şekilde, perimeter() metodunu ise 2 * (width + height) döndürecek şekilde uygulayın.
  • main.dart: Tüm dosyaları içe aktarın (import). 'red' renkli ve 5.0 yarıçaplı bir Circle ile 'blue' renkli, 4.0 genişliğinde ve 6.0 yüksekliğinde bir Rectangle oluşturun. Her şekil üzerinde describe() metodunu çağırın. Ardından her iki şekli de içeren bir List<Shape> oluşturun, liste üzerinde döngü kurun ve her şekil için Area: [area] yazdırın.

Beklenen çıktı:

A red shape with area: 78.5 and perimeter: 31.400000000000002
A blue shape with area: 24.0 and perimeter: 20.0
Area: 78.5
Area: 24.0

Kopya kağıdı

Bir soyut metot (abstract method), gövdesi olmadan bir soyut sınıfta bildirilen bir metottur. Alt sınıflar, kendi uygulamalarını sağlamak için bu metodu geçersiz kılmalıdır (override).

abstract class Animal {
  // Soyut metot - gövde yok
  String makeSound();

  // Somut metot - gövdesi var
  void breathe() {
    print('Breathing...');
  }
}

Alt sınıflar tüm soyut metotları uygulamalıdır:

class Dog extends Animal {
  @override
  String makeSound() {
    return 'Woof!';
  }
}

class Cat extends Animal {
  @override
  String makeSound() {
    return 'Meow!';
  }
}

Soyut türü bir değişken türü olarak kullanabilirsiniz:

Animal a = Dog();
print(a.makeSound());  // Woof!

Animal b = Cat();
print(b.makeSound());  // Meow!
ÖzellikSoyut MetotSomut Metot
Gövdesi var mıHayırEvet
Geçersiz kılınmalı mıEvetHayır
AmaçSözleşmeyi zorunlu kılmakDavranışı paylaşmak
NeredeYalnızca soyut sınıftaHerhangi bir sınıfta

Kendin dene

import 'shape.dart';
import 'circle.dart';
import 'rectangle.dart';

void main() {
  // TODO: 'red' renkli ve 5.0 yarıçaplı bir Circle (Daire) oluşturun

  // TODO: 'blue' renkli, 4.0 genişliğinde ve 6.0 yüksekliğinde bir Rectangle (Dikdörtgen) oluşturun

  // TODO: Daire üzerinde describe() metodunu çağırın

  // TODO: Dikdörtgen üzerinde describe() metodunu çağırın

  // TODO: Her iki şekli de içeren bir List<Shape> oluşturun

  // TODO: Liste üzerinde döngü kurun ve her şekil için "Area: [area]" yazdırın
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler