2011-02-01 12 views
5

Soyut bir sınıf yazıyorum ve alt sınıf tarafından tanımlanması gereken bir değişkenim var (bu durumda süper sınıfta kullanılan bir int). protected değişkenini bir varsayılan değer ile tanımlayıp belirlememeye karar veremiyorum ve alt sınıfın değeri yapıcıda veya setter yöntemiyle değiştirmesine izin veremiyorum. Ya da tüm alt sınıfların onu uygulamak ve kullanmak istedikleri değeri döndürmek için ana sınıftaki soyut bir yöntemi tanımlamak (daha sonra soyut yöntemi kullanarak süper-sınıftaki yönteme erişmek). Birinin diğerinin üzerinde tercih edilmesinin en önemli nedenlerinden biri var mı?Alt sınıf tarafından belirtilmesi gereken veriler için soyut bir yöntem mi yoksa örnek değişken mi kullanmalıyım?

Özet Yöntem:

public abstract int getValue(); 

public int getValue() { 
    return 5; 
} 
  • Artıları:

Kuvvetler alt sınıfı bu değeri hakkında düşünmek ve onlar olmak istediğini seçin.

  • Eksileri:

Hiçbir varsayılan değer, yani alt sınıfların çoğu sadece aynı değeri kullanmak istediğinizde bile hala yöntemi uygulamak zorunda. (Yöntem olmayan soyut yapılmış ve varsayılan değeri döndürür, ancak o zaman değeri hakkında düşünmek için alt sınıfları zorlamak avantajını kaybetmek olabilir)

Korumalı Değişken:

protected int value; 

public SubClassImpl() { 
    value = 5; 
} 
  • Artıları:

onlar umursamazsak varsayılan bir değer ve alt sınıflar sadece göz ardı edebilirsiniz tanımlayabilir.

  • Eksileri: alt sınıfın

Yazarlar değişkenin varlığından haberdar değildir, bu yüzden varsayılan davranışı tarafından sürpriz olabilir.

+1

Değer değişmez mi? Değilse, değeri değiştirmek kimin sorumluluğundadır? –

+0

Değerin değişmez olması için herhangi bir gereksinim yoktur, ancak nesnenin oluşturulmasından sonra değiştirilmesini beklemezdim. – DaveJohnston

+0

Bence diğer perspektiften bakmak daha iyi. Değiştirilebilir hale getirme zorunluluğu yoksa, bunu değişmez hale getirerek başlayın. Bir gereksinim belirirse bunu değiştirilebilir duruma getirin. "Korunan yapıcı parametresi" seçeneği için –

cevap

8

Eh,

  • değer nesnenin ömrü boyunca değiştirmeye muktedir olan var mı ... bağlıdır? Değilse, korumalı bir yapıcı parametresi yapmak ve temel sınıfınızda son bir özel değişken yapmak isteyebilirsiniz.

  • Değişken alt sınıflar, değişkeni diğer değişken duruma göre hesaplamak için bir neden var mı? Eğer öyleyse, soyut bir alıcı uygun olurdu. Aksi takdirde, muhtemelen bir özel değişken ve korumalı bir ayarlayıcı kullanırdım. Ben genellikle özel olmayan değişkenlerin hayranı değilim. Bu, diğer bilgisayar alanlarını değiştirmek gibi, temel sınıfınızdaki değerindeki değişikliklere tepki vermenizi sağlayabilir. Varsayılan bir değerin varlığını önlemek için, alt sınıfın daha sonra ayarlayıcı ile değişebileceği bir başlangıç ​​değerini zorlamak için bunu bir yapıcı parametresiyle birleştirebilirsiniz.o Eğer covariant return types yararlanmak için izin verir ancak bir (değişebilir) alanı veya mülk değildir çünkü

+2

+1. – Raedwald

+0

Teşekkürler, korunan kurucu muhtemelen gitmek istediğim yoldur. – DaveJohnston