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 bir metot, gövdesi olmayan ve soyut bir sınıf içinde bildirilen bir metottur. Metot imzasını tanımlar, ancak uygulamayı her alt sınıfa bırakır. Soyut sınıfı genişleten herhangi bir sınıf, tüm soyut metotları geçersiz kılmalıdır; aksi takdirde o da soyut olur.

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 MetotSomut Metot
Gövdesi varHayırEvet
Ez geçilmeliEvetHayır
AmaçSözleşmeyi zorunlu kılmakDavranışı paylaşmak
NeredeYalnızca soyut sınıfHerhangi bir sınıf
challenge icon

Görev

Kolay

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

Kodunu dört dosyada düzenleyeceksin:

  • shape.dart: Shape bir final alanına (String) ve bunu başlatan bir kurucuya sahip abstract bir color sınıfı tanımla. İki abstract metot bildir: double area() ve double perimeter(). Ayrıca describe() yazdıran somut bir A [color] shape with area: [area] and perimeter: [perimeter] metodu ekle. area() ve perimeter() abstract olduğundan, her alt sınıf kendi hesaplamasını sağlayacak; ancak describe() geçersiz kılınmadan hepsi için çalışacak.
  • circle.dart: Circle sınıfını genişleten bir Shape sınıfı oluştur. final bir radius alanına (double) sahip olsun. Kurucusu color ve radius alsın ve color değerini super'a geçirsin. area() metodunu 3.14 * radius * radius döndürecek şekilde ve perimeter() metodunu 2 * 3.14 * radius döndürecek şekilde uygula.
  • rectangle.dart: Rectangle sınıfını genişleten bir Shape sınıfı oluştur. final width ve height alanlarına (ikisi de double) sahip olsun. Kurucusu color, width ve height alsın ve color değerini super'a geçirsin. area() metodunu width * height döndürecek şekilde ve perimeter() metodunu 2 * (width + height) döndürecek şekilde uygula.
  • main.dart: Tüm dosyaları içe aktar. Rengi Circle ve yarıçapı 'red' olan bir 5.0 ile rengi Rectangle, genişliği 'blue' ve yüksekliği 4.0 olan bir 6.0 oluştur. Her şekil üzerinde describe() çağır. Ardından her iki şekli içeren bir List<Shape> oluştur, liste üzerinde döngü kur ve her şekil için Area: [area] yazdır.

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

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

Kendi başına pratik yap: Online Dart derleyicisi