2015-01-11 30 views
11

Soyut bir sınıfım var ve bunu genişleten bir sınıf var, her iki sınıfta da aynı ada sahip bir yöntemim var. Soyut sınıfın başka bir yönteminde soyut sınıftaki yöntemi çağırmak istiyorum.Gerçek sınıftaki başka bir yöntemden başka bir yöntemden çağrı yöntemiyle gerçek sınıfta

Controller.java

public abstract class Controller { 

    public Result delete(Long id) { 
     return this.delete(id, true); 
    } 
    public Result delete(Long id, boolean useTransaction) { 
     // do something and return result 
    } 
} 

FileGroup.java

public class FileGroup extends Controller { 

    public Result delete(Long id, boolean central) { 
     // do something 
     return super.delete(id); 
    } 
} 

super.delete arama Controller.delete ancak this.delete(id, true) yerine özyinelemeli sonsuz döngü neden ve taşmaları yığın olup Controller içinde delete çağrı FileGroup çağrı delete.

+0

@aioobe Bu tamamen açık değil. OP neden "super.delete (id, central)" yazmıyor? OP'nin gerçekte, "FileGroup" da "Delete" yöntemini Controller'da çağırmak isteyip istemediğini söyleyebiliriz ki bu da Controller'da, 'Controller' içindeki iki argümanı sonsuz bir döngüye neden olmadan çağırır. –

+0

* "OP neden süper.delete (id, central) yazmıyor?" * - Çünkü bu anlamsız bir geçersiz kılma olurdu. * "[...] sonsuz bir döngüye neden olmadan." * - Evet, bu benim varsaydığım şeydir (ve cevabımda buna cevap veriyorum). – aioobe

+1

Bir şey yapmadan dolayı anlamsız bir geçersiz kılma olmaz. –

cevap

7

[...] ama this.delete(id, true) çağrı yerine Controller silmek çağıran FileGroup silmek.

Evet, tüm yöntemler Java'da sanaltır ve bundan kaçınmanın bir yolu yoktur. aşağıdaki gibi ancak Controller bir (non geçersiz kılındı) yardımcı yöntemi oluşturarak çalışabilirsiniz:

public abstract class Controller { 

    private Result deleteHelper(Long id, boolean useTransaction) { 
     // do something and return result 
    } 

    public Result delete(Long id) { 
     return deleteHelper(id, true); 
    } 
    public Result delete(Long id, boolean useTransaction) { 
     return deleteHelper(id, useTransaction); 
    } 
} 

Eğer Controller.delete temsilci alt sınıfa çağrı sahip kaçının Bunu yaparak.

+0

Teşekkürler cevap için Seninle aynı fikirdeyim, ama geçerli sınıftan bahsetmek için 'bu' gibi bir şey var, eğer statikse sadece Controller :: delete (id, true) –

+1

Nope. Bu tür bir çözüm yapmak zorundasın. – aioobe

3

Sorunun ne olduğu tam olarak belli değil. Eğer sadece bir yığın taşması neden olmadan Controller yılında FileGroup çağrı yöntemi delete(id, true) yöntemi delete yapmaya çalışıyorsanız, sadece bunu yapabilirsiniz:

public class FileGroup extends Controller { 

    public Result delete(Long id, boolean central) { 
     // do something 
     return super.delete(id, true); 
    } 
} 

soru tek argüman delete yöntemi nasıl olursa ControllerFileGroup sürümü yerineiki argüman delete yöntemini çağırın, yanıt, @ aioobe yardımcı yöntemi çözüm kullanmanız gerektiğidir.

+0

cevabım, bu sorunu çözerdi, ama gerçekten şu anki sınıftan bahsetmek için 'bu' gibi bir şey olduğunu bilmek isterdim, eğer statik olsaydı, sadece Kontrolör'ü arayabilirsiniz :: delete (id, true) –

+1

@MohseTaheri Hayır Bu sınıfta bir örnek yöntemini çağırmanın ve alt sınıflardaki sürümlerin yürütülmesinin engellenmesinin bir yolu. Özellik yine de anlamsız olurdu. Mevcut sınıfın kontrolünde tanımlandığınız gibi, her zaman aioobe çözümünü kullanabilirsiniz - bunun yerine bu sınıftan özel (veya son) bir yöntem çağırın. –