Bu projede soyutlama (abstraction), kalıtım (inheritance), polimorfizm ve interface konularını farklı geometrik şekiller üzerinden uygulayacaksın. abstract bir Shape sınıfı yazıp Circle, Rectangle ve Triangle'ı ondan türeteceksin; her şekil kendi alan/çevre formülünü uygular. Tahmini süre: 2–3 saat.
abstract classveabstractmetod tanımlamaextendsile kalıtım,super(...)ile constructor zinciri@Overrideile metod ezme (overriding)interfaceimplement etme (Drawable)- Polimorfizm: alt sınıf nesnesini ata-tipte (
Shape) tutmak instanceofve tip dönüşümü (casting)StringBuilderile metin oluşturma
| Dosya | Ne yapar | Dokunacak mısın? |
|---|---|---|
Drawable.java |
draw() sözleşmesini tanımlayan interface |
Hayır (hazır) |
Shape.java |
Soyut ata sınıf — area(), perimeter() abstract; toString burada |
Evet |
Circle.java |
Daire | Evet |
Rectangle.java |
Dikdörtgen | Evet |
Triangle.java |
Üçgen (Heron formülü) | Evet |
Main.java |
Demo / giriş noktası | Hayır (hazır) |
Shape, Drawable interface'ini implement eden abstract bir sınıf. Doğrudan örneklenemez.
- Constructor (TODO 1):
nameparametresinithis.name'e ata. toString(TODO 3): Ad, alan ve çevreyi içeren String döndür. İpucu:String.format("%s | alan=%.2f | çevre=%.2f", name, area(), perimeter()).
area()veperimeter()burada abstract — her alt sınıf kendi formülünü yazar.
- Constructor (TODO 4–6):
super("Daire")(ilk satır),radius < 0iseIllegalArgumentException, yarıçapı ata. area(TODO 7):Math.PI * radius * radius.perimeter(TODO 8):2 * Math.PI * radius.draw(TODO 9): boş olmayan String.
- Constructor (TODO 10–12):
super("Dikdörtgen"), negatif kenar kontrolü, atama. area(TODO 13):genişlik * yükseklik.perimeter(TODO 14):2 * (genişlik + yükseklik).draw(TODO 15):StringBuilderile#kutusu.
- Constructor (TODO 16–19):
super("Üçgen"), pozitiflik + üçgen eşitsizliği kontrolü, atama. area(TODO 20): Heron —s = çevre/2; alan = √(s·(s-a)·(s-b)·(s-c)).perimeter(TODO 21):a+b+c.draw(TODO 22): boş olmayan String.
💡 Ata-metodu ezerken
@Overrideyaz (imza yanlışsa derleyici uyarır).super(...)alt sınıf constructor'ının ilk ifadesi olmalı. π yerineMath.PI. Şekil boyutları kurulduktan sonra değişmez → alanlarıfinalyapabilirsin (bir kez atanır).
Main'i çalıştırınca (sınıflar tamamlandığında):
=== Şekiller ===
Daire | alan=78.54 | çevre=31.42
Dikdörtgen | alan=24.00 | çevre=20.00
Üçgen | alan=6.00 | çevre=12.00
Daire | alan=12.57 | çevre=12.57
Dikdörtgen | alan=10.00 | çevre=22.00
En küçük alan: Üçgen | alan=6.00 | çevre=12.00
En büyük alan: Daire | alan=78.54 | çevre=31.42
En küçük/büyük alanlı şekli demo döngüyle bulur (sıralama H15 konusu).
Projede 13 JUnit testi var (tests/ShapeTest.java — alan/çevre formülleri, polimorfizm, validation). Testleri çalıştırınca skorun otomatik Kaizu paneline işlenir.
1. Öğrenci numaranı gir. student_id.txt dosyasına Kaizu öğrenci numaranı yaz. (Bir kez.)
2. Testleri çalıştır.
- macOS / Linux:
./run-tests.sh• Windows:.\run-tests.ps1
İlk çalıştırmada JUnit kütüphanesi (~6 MB) lib/'e iner. Başlangıçta testler kırmızı; TODO'ları çözdükçe yeşile döner.
3. Skor otomatik gider. Tüm testler geçince (13/13) panelde yeşil tik gelir.
new Circle(5).area()→78.54(π·25).new Triangle(3, 4, 5).area()→6.0(Heron).new Rectangle(4, 6).perimeter()→20.0.new Circle(-1)→IllegalArgumentException.new Triangle(1, 1, 10)→ üçgen eşitsizliğini bozar, exception.
Squaresınıfı:Rectangle'dan türeyen bir kare.- Daha iyi ASCII:
Circle.draw()için gerçek bir daire ASCII'si. - En büyük alanlı şekil:
Main'deki min/max bulma mantığını bir metoda taşı.
Takılırsan proje sayfasındaki "Çözümü Göster" butonunu kullan (proje verildikten 3 gün sonra açılır). Önce en az 1 saat kendin uğraş — tests/ShapeTest.java beklenen davranışı anlamak için iyi bir rehber.