2012-01-03 30 views
9

Tôi có lớp cha trừu tượng và tôi muốn nó là buộc tất cả các lớp con để triển khai phương thức toString().Thực thi toString() trong các lớp con

Tuy nhiên đặt:

public abstract String toString(); 

đang gây ra một lỗi biên dịch:

Repetitive method name/signature for method 'java.lang.String toString()' in class ... 

Tôi tin rằng điều này có thể được gây ra bởi groovy đã có toString xác định.

Cảm ơn

+0

.NET có từ khóa 'mới' để ghi đè cài đặt cơ sở. Tôi tò mò nếu Java có bất cứ điều gì tương tự. –

Trả lời

10

Các toString() là một phần của lớp java.lang.Object mà đã có một cài đặt mặc định cho nó. Vì vậy, về cơ bản bạn không thể ép buộc các lớp con thực hiện nó. Nếu bạn muốn ép buộc loại hành vi này (không chắc chắn lý do) thì bạn có thể làm điều gì đó như bên dưới

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

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

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

Cảm ơn bạn đã giải thích và giải đáp – Dopele

+0

Câu trả lời của Pangea sẽ hoạt động, nhưng nếu bạn đang đi xa này và buộc khách hàng của bạn chấp nhận theo cách của bạn hoặc đường cao tốc, bạn có lẽ nên làm toString() cuối cùng trong lớp trừu tượng. Theo tôi, mặc dù, bạn có thể khẳng định một chút kiểm soát quá nhiều khách hàng của bạn ở đây. Tại sao bạn buộc phải thực hiện toString ngoài những gì mà java.lang.Object cung cấp cho bạn? –

0

Bạn không thể buộc họ phải ghi đè toString(), nhưng bạn có thể, trong lớp cha mẹ trừu tượng, có toString() gọi khác m phương pháp trừu tượng, youGottaOverideToString(), mà lớp con sẽ phải triển khai thực hiện.

6

Câu trả lời ngắn: Không thể. dài câu trả lời: Bạn có thể thử được việc này bằng cách làm như sau thay vào đó, thực hiện trong các tầng lớp phụ huynh:

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

public abstract String getString(); 

Điều này làm cho lớp trẻ cần phải thực hiện "getString()" phương pháp. Tuy nhiên, con của lớp con (cháu) không bảo đảm bị buộc phải thực hiện phương thức đó nếu lớp con triển khai phương thức "getString()". Ví dụ:

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. 

Hy vọng rằng sẽ giúp :)

13

này làm việc cho tôi. Đây có phải là người mới hoặc những người khác đã bỏ lỡ nó?

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

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

Tôi cũng sử dụng mẫu này không có vấn đề –

+2

Nó sẽ chỉ hoạt động nếu lớp cha được tạo thành 'abstract', nhưng đó có thể là những gì được mong đợi ở đây. – Menachem

0

Bạn có thể viết một bài kiểm tra đơn vị sẽ xác định tất cả các lớp mở rộng lớp trừu tượng của bạn và xác minh rằng họ khai báo toString(). Để quét, bạn có thể sử dụng thư viện Reflections:

@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"); 
     } 
    }); 


    } 
Các vấn đề liên quan