2012-08-31 17 views
6

Thật khó để tạo tiêu đề ngắn gọn cho việc này.Làm thế nào để tránh đánh dấu hai lần khi cắt là trên một siêu lớp, nhưng một lớp học thừa kế ghi đè?

Dù sao, hãy tưởng tượng tôi có một lớp cha mẹ:

public class Shape { 
     public Dimensions getDimensions() { 
      // Does some generic stuff. 
     } 
    } 

Tôi có một lớp được thừa kế từ nó mà đè getDimensions phương pháp:

public class Circle extends Shape { 
     public Dimensions getDimensions() { 
      // Does some stuff. 
      super.getDimensions(); 
     } 
    } 

Khi tôi tạo ra một khía cạnh với một pointcut trên Shape.getDimensions , các phím tắt được nhấn hai lần khi Circle.getDimensions được gọi: một lần cho Circle.getDimensions, sau đó một lần khi nó gọi super.getDimensions.

Các pointcut trông giống như sau: @Pointcut("execution(* Shape.getDimensions(..))")

Tôi đã thêm một hack bên trong những lời khuyên để kiểm tra tên loại của tuyên bố (sử dụng JoinPoint.getSignature().getDeclaringType().getName()), nhưng tôi thấy nó khá thô và nó cảm thấy giống như một hack . Tôi nghĩ có PHẢI là một cách tốt hơn để làm điều này.

Có phải không?

Xin lỗi nếu định dạng không tốt lắm. Lần đầu tiên đặt câu hỏi ở đây (tôi thường có thể tìm thấy câu trả lời).

Trả lời

5

Có thể bạn có nghĩa là phím tắt của bạn sử dụng Shape+.getDimensions() (với dấu cộng), nếu không nó sẽ không phù hợp với Circle.

Dù sao, bạn có thể giải quyết vấn đề như thế này (Tôi hy vọng cú pháp AspectJ mẹ đẻ là okay cho bạn, tôi thấy nó rất rõ ràng hơn nhiều và biểu cảm hơn):

public aspect ShapeAspect { 
    pointcut getDimensions() : execution(* Shape+.getDimensions()); 
    pointcut getDimensionsNoSuper() : getDimensions() && !cflowbelow(getDimensions()); 

    after() : getDimensionsNoSuper() { 
     System.out.println(thisJoinPointStaticPart); 
    } 
} 
+0

trình đẹp, cảm ơn. Tôi quen với phong cách chú thích hơn, nhưng chìa khóa là cuộc gọi cflowbelow. Trong quá trình cố gắng tìm hiểu xem liệu tôi có thể ngưng tụ điều đó thành một lời khuyên duy nhất (không thể hiểu được), tôi đã tìm thấy phụ lục đáng yêu này: http://www.eclipse.org/aspectj/doc/next/progguide/ semantics-pointcuts.html – Depressio

+0

Vì vậy, cảm ơn trước vì đã chấp nhận và upvoting câu trả lời của tôi. ;-) Lam ơn Lam. – kriegaex

+0

Tôi dường như cần 15 điểm để làm như vậy. Tôi chỉ có 11. Tin tôi đi, tôi đã cố gắng! :( – Depressio

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