2015-05-05 19 views
5

Halihazırda birkaç ön hesaplamalar yapan ancak yöntemin geri dönmesi beklenen son sonucu sağlayamayan soyut bir sınıfta bir String foo() yöntemim var. Yani istediğim, soyut sınıfımdan soyut olmayan her bir sınıfın, ilk super() çağrıldığı ve sonuç hesaplandığı şekilde foo'u uygulamak zorunda olmasıdır. Bunu java'da zorlamak için bir yol var mı?Geçersiz kılınmak için soyut olmayan yöntem kuvveti

+0

nihai hesaplamalar veya dönüş değer (ler) bu –

+1

metodunun imzasıyla paylaşmak lütfen? Onlara aynı ismi verdim (ki bu elbette ki mümkün değil) çünkü temelde aynı şeyi yapıyorlar. – MadProgrammer

cevap

15

Evet, soyut yöntem template method pattern kullanmak yeniden tasarlayarak ve dahil ederek: Eğer bir yöntemi geçersiz kılmak için alt sınıfları zorlamak istiyorsanız Temelde

public abstract class AbstractSuper { 
    public final String foo() { 
     // Maybe do something before calling bar... 
     String initialResult = bar(); 
     // Do something common, e.g. validation 
     return initialResult; 
    } 

    protected abstract String bar(); 
} 

, bu soyut olmak zorunda yapar - ama bu Biliyoruz ki Diğer kod tarafından çağrılan yöntem olması gerekir ...

+0

iki yöntem çağırmak için nasıl bir kongre var mı ihtiyacı olduğunu gerçekleştirmek için ya ihtiyacı soyut bir yöntemi çağırmak mı foo –

+0

@ principal-ideal-domain Onlar? 'Soyut' yöntemi, tüm hesaplamanın farklı bir bölümünü gerçekleştirir, dolayısıyla bir isme göre olmalıdır. Aynı isim, bir çocuk dersinde soyut yöntemin nasıl uygulanacağı konusunda bazı yanlış anlaşılmalara neden olabilir. – Tom

+0

@Tom Evet, bu doğru. Farklı bir parça yapar. Ama genellikle yöntemimi, yaptıklarıyla değil, geri döndükleriyle ararım. Örneğin şu anki durumumda sadece yöntem çağrılarının sayısını saymak istiyorum, bu yüzden foo'm sayacı ++ gibi görünüyor; dönüş çubuğu(); '. Bu arada: Soyut yöntemin çağrısını, onu uygulayan sınıflarda yasaklamak mümkün mü? –

4

Bunu Java'da yapmanın bir yolu yok. Ancak, soyut olan ve onu çağıran bir başka yöntemi de ilan edebilirsiniz. Şunun gibi:

public final String foo() { 
    String intermediate = ... // calculate intermediate result; 
    return calculateFinalResult(intermediate); 
} 

protected abstract String calculateFinalResult(String intermediate); 

Eğer calculateFinalResult geçersiz zorunda kalacak Bu şekilde. super örneğinin çağrılması gerekli değildir. Ayrıca alt sınıflar, foo()'nu final olarak bildirildiği gibi yeniden tanımlayamaz.

+1

Sadece bir not: Değiştiricilerin uygun bir sıralamasını kullanmak (örneğin, "korumalı" ve "soyut") iyi bir fikirdir. Burada önerilen bir sıralama bulabilirsiniz: https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.8.7-modifiers. – Tom

3

Böyle bir şey mi var?

public abstract class MyBean { 

    public final String foo(){ 
     String preFinalResult = [...]; 
     return doFinalResult(preFinalResult) 
    } 

    protected abstract String doFinalResult(String preFinal); 
} 
+1

"DoFinalResult" ifadesinin değiştiricisini "public" konumundan "protected" olarak değiştirmek iyi bir fikir olabilir, bu nedenle diğer sınıflar (aynı sınıftaki alt sınıflar ve sınıflar hariç) doğrudan erişemez. – Tom

İlgili konular