2016-11-02 15 views
8

tôi muốn làm một cái gì đó như thế này:Có thể chỉ định một hàm tĩnh trong giao diện Kotlin không?

interface Serializable<FromType, ToType> { 
    fun serialize(): ToType 
    companion object { 
     abstract fun deserialize(serialized: ToType): FromType 
    } 
} 

hoặc ngay cả điều này sẽ làm việc cho tôi:

interface Serializable<ToType> { 
    fun serialize(): ToType 
    constructor(serialized: ToType) 
} 

nhưng không phải biên dịch. Có một cú pháp cho điều này, hoặc tôi sẽ bị buộc phải sử dụng làm cho giao diện này cho một nhà máy? Hoặc có câu trả lời nào khác không? Điều đó sẽ được gọn gàng!

Trả lời

5

Về cơ bản, không có gì trong một companion object có thể abstract hoặc open (và do đó được ghi đè), và không có cách nào để yêu cầu triển khai companion object s để có một phương pháp hay để xác định/yêu cầu một constructor trong một giao diện.

Một giải pháp khả thi cho bạn là để tách hai chức năng này thành hai giao diện:

interface Serializable<ToType> { 
    fun serialize(): ToType 
} 

interface Deserializer<FromType, ToType> { 
    fun deserialize(serialized: ToType): FromType 
} 

Bằng cách này, bạn sẽ có thể thực hiện các giao diện đầu tiên trong một lớp học và làm companion object của nó thực hiện một trong những khác:

class C: Serializable<String> { 
    override fun serialize(): String = "..." 

    companion object : Deserializer<C, String> { 
     override fun deserialize(serialized: String): C = C() 
    } 
} 

Ngoài ra, có một hạn chế nghiêm trọng only a single generic specialization of a type can be used as a supertype, vì vậy mô hình này của serializing thông qua việc thực hiện giao diện có thể bật ra không thể mở rộng đủ, không cho phép triển khai nhiều với differen t ToType s.

+3

Nhưng tại sao? Tại sao nó được thiết kế theo cách này? – cuddlecheek

0

Tôi tương đối mới với Kotlin. Dưới đây là 2 ¢

  1. đối tượng đồng hành của bạn là một thể hiện của một lớp và không thể được kế thừa từ đó. Đây là lý do tại sao chức năng trừu tượng sẽ không có nơi để thực hiện. Trong Java, kết quả tương tự yêu cầu lớp ẩn danh triển khai lớp trừu tượng, nhưng rất khác với phương thức ghi đè đối với cá thể của một lớp.

  2. Không thể sử dụng giao diện để tạo thể hiện, do đó không sử dụng cho hàm tạo trong giao diện.

Tại sao bạn không tạo lớp trừu tượng chung? Sau đó, chức năng trừu tượng hoặc mở sẽ làm việc cho cả serialize(): ToType và deserialize (serialized: ToType): các hàm FromType.

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