2013-01-09 25 views
6

Tôi đang sử dụng thư viện diễn viên Akka tại đây. Thư viện tác nhân xác định một phần chức năng "nhận" mà một diễn viên mở rộng "diễn viên" phải thực hiện để đối phó với các thông điệp khác nhau. Tôi đang tạo ra một hệ thống phân cấp đặc điểm cho ứng dụng của tôi, nơi đặc điểm "clockActor" mở rộng Actor và "MasterClock" và "SubClock" mở rộng "clockActor". Tôi đang tìm cách thêm chức năng phổ biến của đồng hồ vào chức năng nhận "đặc điểm" của đồng hồ nhưng sau đó làm cách nào để thêm chức năng phụ vào chức năng nhận trong các đặc điểm đồng hồ chính và phụ?Mở rộng một phần chức năng được thực hiện một phần trong scala

Tóm lại, tôi cần một cách để thêm báo cáo trường hợp bổ sung vào một chức năng một phần. Ý tưởng?

+2

Bạn có thể soạn các chức năng một phần với [ 'orElse'] (http://www.scala-lang.org/api/current/index .html # scala.PartialFunction). Nó sẽ làm các trick? – 4e6

+0

Không thực sự. Các thư viện akka làm tất cả các công cụ nhắn tin của nó bằng cách gọi nhận được nội bộ vì vậy tôi không thể nhận được trong đó một phụ thêm một orElse cho cuộc gọi. – Alex

+0

trên thực tế, có, hoặcElse thực hiện chính xác những gì tôi cần. Sloppy googling và chỉ chọn kết quả đầu tiên làm cho nó trông khác nhau nhưng tôi đã có nó làm việc ngay bây giờ. – Alex

Trả lời

11

Như đã gợi ý, bạn có thể dễ dàng soạn PartialFunctions sử dụng orElse

trait ClockActor { 

    def commonOp = { 
     case ... => ... 
    } 

} 

class MasterClock extends Actor with ClockActor { 

    def receive = commonOp orElse masterOp 

    def masterOp = { 
     case ... => ... 
    } 

} 

class SubClock extends Actor with ClockActor { 

    def receive = commonOp orElse subOp 

    def subOp = { 
     case ... => ... 
    } 

} 
1

Một điều mà nói đến cái tâm là để làm một cái gì đó như thế này:

trait ClockActor { 
    def pf:PartialFunction[String, Boolean] = { 
    case "a" => true 
    case v if(_pf.isDefinedAt(v)) => _pf.apply(v) 
    } 

    def _pf:PartialFunction[String, Boolean] = Map.empty 
} 

object MasterClock extends ClockActor { 

    override def _pf:PartialFunction[String, Boolean] = { 
    case "b" => false 
    } 

    println(pf("a")) 
    println(pf("b")) 

} 

đó sẽ ra:

scala> MasterClock 
true 
false 

Giá trị true xuất phát từ định nghĩa trong hàm một phần của Trait ClockActor , false xuất phát từ đối tượng MasterClock.

+0

Yea công trình này. Tôi dường như có ý tưởng rằng khi bạn "ghi đè lên" một chức năng thì bạn không thể chạm vào bản gốc. Nếu tôi phải làm như vậy thì tôi sẽ sử dụng cách làm việc này nhưng tôi đang tìm kiếm nhiều hơn một cách mà những người đang triển khai các lớp con không phải quan tâm đến việc gọi siêu hoặc bất kỳ việc triển khai nào trong đặc điểm cha mẹ. – Alex

+0

@ Alex, tôi đã thực hiện chỉnh sửa nhanh có thể giúp ích nhiều hơn với những gì bạn đang muốn hoàn thành. Tôi đã thay đổi đặc điểm để có hai hàm, một 'pf' sẽ là công khai và' _pf' được mặc định rỗng và sẽ bị ghi đè trong lớp khi cần thiết. Nó cơ bản giống như những gì tôi đã có trước đây, nhưng theo cách này người dùng không cần phải lo lắng về việc gọi siêu vì các cuộc gọi công khai sẽ là chức năng 'pf' của đặc điểm. – jcern

+0

Có phiên bản hoạt động nhưng hoàn toàn khác. lớp 'MasterNode kéo dài TreeNode { def masterReceive: Nhận = { trường hợp "specificBehaviour"=> {println ("Tôi đang hành xử như một bậc thầy")}} override def nhận = masterReceive OrElse super.receive } ' Nơi nhận được là phương pháp tôi buộc phải thực hiện trong đặc điểm cha mẹ và tôi chỉ tạo ra một chức năng một phần mới cho hành vi mới trong phân lớp và chuỗi chúng với orElse. – Alex

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