2016-01-24 19 views
7

Thường thì tôi thấy mình trong một tình huống mà tôi có một lớp cha có nhiều tham số tùy chọn, và các tham số tương tự cũng cần phải là tham số tùy chọn trong các lớp con của nó.Kotlin: Làm cách nào để tránh trùng lắp mã trong các nhà xây dựng?

Ví dụ, lớp cha:

abstract class Plugin(val name: String, val version: String = "1.0", 
         val author: String = "", val description: String = "") 

Mở rộng lớp này là một nỗi đau. Dưới đây là một ví dụ lớp con:

abstract class CyclePlugin(name: String, version: String = "1.0", author: String = "", 
         description: String = "", val duration: Int, val durationUnit: TimeUnit 
         = MILLISECONDS) : Plugin(name, version, author, description) 

Lưu ý: Tôi sẽ trả lời câu hỏi này với giải pháp của tôi. Tôi đang tìm kiếm giải pháp tốt hơn.

+1

Tuy nhiên, một lý do khác để tránh thừa kế :) Nếu những tham số đó là tùy chọn tại sao lại sử dụng chúng trong hàm dựng? Thay vào đó bạn chỉ có thể khai báo thuộc tính thường xuyên 'var optionalProperty: String? = "DefaultValue" 'trong lớp cơ sở. – miensol

Trả lời

5

Giống như @miensol đề cập, bạn có thể xác định tài sản của bạn bên ngoài của các nhà xây dựng.

abstract class Plugin(val name: String) { 

    open val version: String = "1.0" 
    open val author: String = "" 
    open val description: String = "" 

} 

Sau đó, bạn có thể xác định CyclePlugin với chỉ cần thiết name tham số:

abstract class CyclePlugin(name: String, val duration: Int, 
          val durationUnit: TimeUnit = MILLISECONDS) : Plugin(name) 

Sau đó, ví dụ, bạn có thể ghi đè lên một số lĩnh vực cho ExamplePlugin:

class ExamplePlugin : CyclePlugin("Example Plugin", 8, TimeUnit.SECONDS) { 

    override val author = "Giovanni" 
    override val description = "This is an example plugin" 

} 
+0

Điều gì sẽ xảy ra nếu 'CyclePlugin' không trừu tượng và có thể được khởi tạo với các tham số tùy chọn đó? – BakaWaii

5

Cách tôi thường giải quyết vấn đề này là bằng cách tạo một lớp dữ liệu để đại diện cho các tham số.

data class PluginInfo(val name: String, val version: String = "1.0", 
         val author: String = "", val description: String = "") 

Sau đó tôi lấy lớp này làm tham số trong các hàm tạo.

abstract class Plugin(val info: PluginInfo) 

abstract class CyclePlugin(info: PluginInfo, val duration: Int, 
          val durationUnit: TimeUnit = MILLISECONDS) : Plugin(info) 

Sau đó một plugin ví dụ có thể được thực hiện như thế này:

class ExamplePlugin : CyclePlugin(PluginInfo("Example Plugin", author = "Jire"), 8, TimeUnit.SECONDS) 
Các vấn đề liên quan