2010-10-25 24 views
7

Tôi muốn tận dụng cảnh báo mà vấn đề Scala khi thiếu khớp ("không đầy đủ") - để tôi không quên một (tôi có hàng chục). Ví dụ đơn giản sau đây cho thấy nỗ lực của tôi:Kết hợp mẫu Scala tiếp tục nói rằng "khớp không đầy đủ!"

sealed case class MESSAGE() 
class SUCCESS_MESSAGE extends MESSAGE 
class FAILURE_MESSAGE extends MESSAGE 

def log(str: String, msgType: MESSAGE) { 
    msgType match { 
     case t:SUCCESS_MESSAGE => println("FAILURE: " + str) 
     case t:FAILURE_MESSAGE => println("SUCCESS: " + str) 
    } 
} 

Vấn đề là nó nói "khớp không đầy đủ!" mặc dù tất cả các kết hợp có thể được liệt kê. Nếu tôi đặt "trường hợp _ =>" vào đó, toàn bộ điểm cảnh báo sẽ bị vô hiệu vì tôi có thể thêm

class INFO_MESSAGE extends MESSAGE 

và không có cảnh báo nào được phát hành.

Có giải pháp nào không?

+6

SUCCESS_MESSAGE nên in "THẤT BẠI:", là bạn khá chắc chắn? –

+2

Tôi khuyên bạn nên chống lại việc mở rộng một trường hợp trong bất kỳ trường hợp nào. Chỉ là FYI. – jsuereth

Trả lời

32

Lý tưởng nhất, bạn không nên mở rộng một lớp cụ thể và đặc biệt không phải là một lớp học!

Do không có khả năng tùy chỉnh SUCCESS_MESSAGEFAILURE_MESSAGE, bạn có thể cũng muốn làm những đơn này.

Cuối cùng, dấu gạch dưới là một Điều xấu (tm) trong biến Scala hoặc tên lớp. Tất cả các tên UPPERCASE cũng không phải là thành ngữ. Vì vậy:

sealed trait Message 
case object SuccessMessage extends Message 
case object FailureMessage extends Message 

def log(str: String, msgType: Message) = msgType match { 
    case SuccessMessage => println("Success: " + str) 
    case FailureMessage => println("Failure: " + str) 
} 

Ngoài ra, và tôi sẽ khuyên này, bạn có thể quấn chuỗi thông điệp thực tế:

sealed trait Message { def msg: String } 
case class Success(msg:String) extends Message 
case class Failure(msg:String) extends Message 

def log(msg: Message) = msg match { 
    case Success(str) => println("Success: " + str) 
    case Failure(str) => println("Failure: " + str) 
} 
+0

s/trong tên biến Scala/trong tên lớp Scala/ –

+0

tên biến HOẶC lớp, nếu bạn muốn chính xác :) –

+2

Ví dụ đầu tiên vẫn gặp vấn đề tương tự, vì 'Thư' không được đánh dấu là 'abstract'. Ví dụ thứ hai là ok vì phương thức trừu tượng 'msg' đảm bảo rằng' Message' cũng trừu tượng. –

27

Bạn đã bỏ lỡ một trường hợp: Thư có thể là một phiên bản của MESSAGE, không phải là một trong các lớp con của nó.

Nếu bạn không muốn làm trường hợp này là không thể, bạn cần tạo MESSAGE tóm tắt. Điều này sẽ làm cho cảnh báo biến mất.

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