2012-01-03 2 views
9

Soyut bir üst sınıfım var ve toString() yöntemini uygulamak için tüm alt sınıfların kuvvet olmasını istiyorum.Alt sınıflarda toString() uygulamasının zorlanması

Ancak koyarak:

public abstract String toString(); 

bir derleme hatasına neden olan:
Repetitive method name/signature for method 'java.lang.String toString()' in class ... 

bu tanımlanmış harika zaten sahip toString neden olmuş olabilir inanıyoruz.

Teşekkür

+0

.NET, bir temel uygulamanın geçersiz kılınacağı bir 'new' anahtar sözcüğüne sahiptir. Java benzer bir şey varsa merak ediyorum. –

cevap

10

toString(), zaten bir varsayılan uygulamaya sahip olan java.lang.Object sınıfının bir parçasıdır. Yani aslında alt sınıfları uygulamak için zorlayamazsınız. mümkün değil mi: Eğer bu tür davranışları zorlamak istiyorsanız

public class abstract SuperClass 
{ 
    public abstract String myToString(); 

    public String toString() 
    { 
    //print super class fileds 

    //enable subclass to do the printing 
    myToString(); 
    } 
} 
+0

Açıklama ve çözüm için teşekkürler – Dopele

+0

Pangea'nın yanıtı işe yarayacak, ancak bu kadar uzağa gidip müşterilerinizi yolunuzu ya da otobanı kabul etmeye zorlayacaksanız, muhtemelen soyut sınıfta toString() finalini yapmalısınız. Benim görüşüme göre, müşterilerinizin burada çok fazla kontrol sahibi olduğunu iddia ediyor olabilirsiniz. Neden toString uygulamasının java.lang.Object öğesinin size verdiğini ötesine zorluyorsunuz? –

0

Sen soyut üst sınıfta, (toString olabilir toString() geçersiz kılmak için zorlamak, ama olamaz) diyoruz alt sınıfları zorunda kalacak başka m soyut yöntem youGottaOverideToString(), uygulamak.

6

Kısa cevap aşağıda (emin değilim neden) o zaman böyle bir şey yapabilirsiniz. Uzun cevap:

public final String toString() { 
    getString(); 
} 

public abstract String getString(); 

Bu çocuk sınıfı "getString()" yöntemi uygulamak gerekir neden olur: Sen üst sınıfta uygulamak yerine aşağıdakileri yaparak bunun üstesinden deneyebilirsiniz. Ancak, çocuk (torun) sınıfının çocuğu, çocuk sınıfı "getString()" yöntemini uygularsa, bu yöntemi uygulamak zorunda kalmanın bir garantisi yoktur. Örnek:

A is the parent class, with the getString() method. 
B extends A, and implements the getString() method. 
C extends B, doesn't have to implement the getString() method. 

Umut yardımcı olur :)

13

Bu benim için çalışıyor. Bu yeni mi yoksa başkaları mı kaçırdı?

public abstract class Filterable 
{ 
    @Override 
    public abstract String toString(); 
} 

public class ABC extends Filterable 
{ 
    // Won't compile without toString(); 
} 
+0

Aynı zamanda bu modeli problemsiz kullanıyorum –

+2

Yalnızca ana sınıf "abstract" yapılmışsa çalışacak, ancak muhtemelen burada istenen şey buydu. – Menachem

0

Sen soyut sınıf uzanan tüm sınıfları bulup() onlar toString beyan doğrular bir birim test yazabilir. Taranmak için aşağıdaki kodu kullanabilirsiniz: Reflections kitaplık:

@Test 
    public void validateToString() { 
    final Reflections dtoClassesReflections = new Reflections(new ConfigurationBuilder() 
     .setUrls(ClasspathHelper.forPackage("my.base.package")) 
     .filterInputsBy(new FilterBuilder() 
     .include(".*Dto.*") // optionally filter only some particular classes 
     .exclude(".*Test.*")) // exclude classes from tests which will be scanned as well 
     .setScanners(new SubTypesScanner(false))); 

    final Set<Class<?>> allDtoClasses = dtoClassesReflections.getSubTypesOf(YourAbstractClass.class); // you set your class here (!!). You can set Object.class to get all classes 

    allDtoClasses.forEach(dtoClass -> { 
     logger.info("toString() tester testing: " + dtoClass); 

     try { 
     dtoClass.getDeclaredMethod("toString"); 
     } catch (NoSuchMethodException e) { 
     fail(dtoClass + " does not override toString() method"); 
     } 
    }); 


    }