Merhaba.Abstract classın ne olduğunu, özelliklerini ve s. öğrendim.Ama şimdiye kadar kullanmaya ihtiyaç duymadım.Hangi durumlarda kullanılıyor? Teşekkürler

soruldu: 02 Ağu '14, 08:27

Serxan's gravatar image

Serxan
51691106107
cevap kabul oranı: 46%

2

Kabaca özetlersek her metodun tanımlanması genişleten class'a bırakılacaksa interface yazarsın. Ama içinde bir tane bile tekrar tanımlanmasına gerek olmayan bir metod barındıracaksa o zaman abstract class yazıyorsun.

(02 Ağu '14, 21:18) kodmanyagha kodmanyagha's gravatar image

@kodmanyagha'nın söyledigini orneklersek; Animal sinfi icinde move() ve breathe() metotları olsun. animal'dan genişletilecek olan cat ve dog siniflari icin nefes alma ortak ayni bicimde uygulanacak(aynı kod), hareket etme farkli bicimde uygulanacaksa 2 sinif icin de aynı kodu yazmamak adina(dry) breathe metodu govdesiyle birlikte Animal icinde, move ise sadece imzasıyla(govdesiz, abstract) yazılır ki turetilen siniflarda farkli bir davranis sergilenebilsin(polymorphism)

(11 Ağu '14, 03:17) gturedi gturedi's gravatar image

Sıradan kod parçaları için Absract classlara ve Interface lere ihtiyaç duyulmaz. Hatta OOP ye bile ihtiyaç duyulmaz. Eğer bakımı kolay, Tekrar kullanılabilirliği yüksek kod yazma ihtiyacı varsa Interface ve Absract class kullanma ihtiyacı ortaya çıkar. Tasarım Kalıplarını incelerseniz cevabı rahatlıkla bulabilirsiniz.

permanent link

cevaplandı: 06 Ağu '14, 10:24

Fatih%20A%C5%9Flamac%C4%B1's gravatar image

Fatih Aşlamacı
1.0k111929
cevap kabul oranı: 14%

En basitinden db tablolarında hiçmi type olarak bir tablondaki verileri ayırt etmedin ve bu type'a göre alanlar yaratmadın.

En son kullandığım bir örneği paylaşayayım.

Price tablom var. Bu tablo gelen verinin tipine göre belirli alanlar dolduruyor. Price'a göre domain yapımı oluşturuyorum.

DB tablom

Price
id
type
val
stream
download
..
..
..

Object Design

discriminator(type)
abstract price {
id
val
}

class streamprice extends price{
stream
}

class downloadprice extends price{
download
}

gibi basit bir örnek.

İhtiyacım olan nesneye göre bir soyutlama yapıyorum. Eğer veri stream'den geliyorsa, direkt olarak streamprice sınıfımı kullanıyorum. Eğer veri download'a göre geliyorsa yine downloadprice sınıfımı kullanıyorum. Basitce bir soyutlama ile ihtiyacıma yönelim bir dizayn oluşturmuş oldum.

İleride price nesnesi üzerinde farklı type'larda gelebilir ve ortak olan bu alanları ihtiyacıma göre soyutlayabilirim yada alt sınıflarda genişletebilirim. Böylece gereksiz veri tekrarından ve mantıksal olarak kod ayrıştırmasından uzak kalırım. Ben Stream için bir price belirlerken, download yada farklı bir sınıf ile ilgili veri ne olacak gibi bir düşünceye gerek duymam.

permanent link

cevaplandı: 02 Ağu '14, 17:57

Turgay%20Can's gravatar image

Turgay Can
8.4k63799
cevap kabul oranı: 18%

değiştirildi: 02 Ağu '14, 17:59

1

yukarida yaptigini ben C++-da kullandim.ama neden mutlaka abstract olmali?sen bunu abstract olmayan base class kullanarak da yapa bilirsin

(04 Ağu '14, 00:42) Serxan Serxan's gravatar image

Base class ile kasıt soyutlaştırmadan sadece kalıtım ile bunu yapabilmeyi kasıt ediyorsanız. Tabiki yapılabilir ama yine yazdığım son paragrafı okumanızda fayda var. OOP'nin nimetlrinden faydalanmak tercih meselesidir. Mutlaka böyle olmalımı eğer OOP dil kullanıp, OOP yi kullanmıyorsanız aslında OOP yazmıyorsunuz demektir.

Asla mutlak böyle olmalıdır demem çünkü belirttiğiniz gibi sadece kalıtım ilede işinizi görürsünüz, sadece gereksiz veri tekrarları, davranışlar için ek kontroller yazmış olursunuz.

Tercih meselesi, her yiğidin yoğurt yiyişi farklıdır :)

(05 Ağu '14, 04:25) Turgay Can Turgay%20Can's gravatar image

abstract class kalıtımın zorunlu olduğu durumarda kullanılır.Gövdesiz yada gövdeli metotlar bulundurabilir. Ancak bu sınıf özelliklerinden faydalanmak için mutlaka extend edilmesi gerekir aski halde kullanılamaz

abstract class a { void deneme(){

}
abstract void deneme12();

}

class b extend a { //zorunlu void deneme12(){

}

ayrıca javada çoklu kalıtım işlemi yoktur. }

permanent link

cevaplandı: 03 May '15, 21:58

salihzekicamurcu's gravatar image

salihzekicamurcu
10111
cevap kabul oranı: 0%

Java için özel bir kullanım biçimi yok. Kullanım alanları tamamen kullanıcıya kalmış olmakla birlikte genelde maintenability, readability, reusability gibi özellikleri güçlendirmek için kullanılır. Bazı "Design Pattern"'leri uygulamak için kullanılır. Basit bir örnek vereyim :

Senaryo : Şirket çalışanlarının maaşlarını mevkilerine göre hesapla.

Kötü çözüm şöyle olurdu :

alt text

Sınıf implementasyonu :

class SalaryCalculator{

CalculateSalary(user : IUser){

if(user.position === Manager){
return 300;
}
else if(user.position === Officer){
return 150;
}
else if(user.position === Laborer){
return 100;
}

}

}

Bu örnekte Open-Closed prensibini ihlal ediyoruz. Uygulamamıza yeni pozisyonların eklenmesi bizim CalculateSalary() metodunda değişiklik yapmamızı gerektiricek. Refactoring(kodu tekrardan düzenleme) işlemi yaparken çeşitli yerleri bozmaya açık bir yapı oluşturucak ve gittikçe büyüyen bir metod olucak. Dolayısıyla kodun okunabilirliği, devam ettirilebilirliği ve tekrardan kullanılabilirliği azalıcak.

Bunun yerine aşağıdaki gibi bir yapı oluşturulsa daha iyi olurdu.

UML

    main(){

    SalaryCalculator salaryCalculator = new OfficerSalaryCalculator();
    salaryCalculator = new LaborerOfficeSalaryCalculator();}

Şeklinde interchangeable(kendi içinde değiştirilebilir) algoritmalar oluşturmuş olduk. Yeni bir pozisyon eklendiğinde pozisyonla ilgili sınıfı ve algoritmasını o sınıfa yazıp, polymorphism(çok biçimlilik) kullanarak maaşı hesaplattırabiliriz. Aynı zamanda bu problem, Strategy Pattern ile de çözülebilirdi. Eğer ki ikramiye, mesai gibi "ek" sorumluluklar gerekseydi o zaman da Decorator Pattern kullanabilirdik. Ayrıca çok daha rahat test edilebilir oldu. TDD, BDD için daha elverişli bir yapı oldu.

Not : Kodu Typescript'e göre yazdım. Java'da da bi kaç değişiklikle çalışıcaktır :))

permanent link

cevaplandı: 04 May '15, 10:14

ArnesTwin's gravatar image

ArnesTwin
1.1k1511
cevap kabul oranı: 14%

değiştirildi: 04 May '15, 11:51

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,079
×4

Soruldu: 02 Ağu '14, 08:27

Görüntüleme: 819 kez

Son güncelleme: 04 May '15, 11:51

powered by BitNami OSQA