2011-07-17 30 views
5

Tôi có hai lớp, Hướng dẫn và UserGuid. Guid có một đối số kiểu. UserGuid là một trường hợp đặc biệt của Guid đại diện cho một thực thể (Người dùng) mà không có lớp, vì vậy tôi đã thực hiện nó như một hướng dẫn [Bất kỳ].Siêu đối tượng đồng hành chung trong Scala

Tôi có một số phương pháp áp dụng cho Hướng dẫn mà tôi muốn chia sẻ giữa hai loại, vì vậy tôi đặt chúng trong một lớp cha (GuidFactory). Tuy nhiên, vì Guid được tham số hóa nên tôi phải tham số hóa tính trạng GuidFactory, nếu không kết quả Guid sẽ được tham số hóa là Guid [_].

Kết quả là, đối tượng UserGuid bạn đồng hành của tôi không biên dịch, phàn nàn rằng:

error: com.wixpress.framework.scala.UserGuid takes no type parameters, expected: one object UserGuid extends GuidFactory[UserGuid]

Có cách nào tôi có thể chia sẻ các phương pháp áp dụng giữa Guid và UserGuid hoặc tôi phải lặp lại chúng hoặc sử dụng đúc?

Mã sau.

abstract class TypeSafeId[I, T](val id: I) extends Serializable  
class Guid[T](override val id: String) extends TypeSafeId[String, T](id) 
class UserGuid(override val id: String) extends Guid[Any](id) 

trait GuidFactory[I[A] <: Guid[A]] { 
    def apply[T](id: String): I[T] 
    def apply[T](id: UUID): I[T] = apply(id.toString) 
    def apply[T](ms: Long, ls: Long): I[T] = apply(new UUID(ms, ls)) 
    def apply[T](bytes: Array[Byte]):I[T] = apply(UUID.nameUUIDFromBytes(bytes)) 
    def random[T] = apply[T](UUID.randomUUID()) 
} 

object Guid extends GuidFactory[Guid] { 
    override def apply[T](id: String) = new Guid[T](id) 
} 

object UserGuid extends GuidFactory[UserGuid] { 
    override def apply(id: String) = new UserGuid(id) 
} 
+0

Lệnh 'phương pháp apply' trong' GuidFactory' dường như không làm cho ý nghĩa cho 'UserGuid'. Ví dụ. 'UserGuid.apply [String] (" ")' trả về gì? Theo 'GuidFactory', nó sẽ có kiểu' UserGuid [String] ', không tồn tại. –

+0

chính xác là vấn đề, tôi muốn nó là UserGuid.apply ("1234"), không phải UserGuid.apply [String] ("1234"); điều này sẽ có ý nghĩa, vì GuidFactory lấy một tham số kiểu I, là một kiểu con của Guid và có một tham số, và UserGuid là một kiểu con của Guid và cung cấp một tham số như ... –

Trả lời

2

Đây là tốt nhất mà tôi có thể đề nghị:

import java.util.UUID 
abstract class TypeSafeId[I, T](val id: I) extends Serializable 
class Guid[T](override val id: String) extends TypeSafeId[String, T](id) 
class UserGuid(override val id: String) extends Guid[Any](id) 

trait GuidFactory[G] { 
    def apply(id: String): G 
    def apply(id: UUID): G = apply(id.toString) 
    def apply(ms: Long, ls: Long): G = apply(new UUID(ms, ls)) 
    def apply(bytes: Array[Byte]): G = apply(UUID.nameUUIDFromBytes(bytes)) 
    def random = apply(UUID.randomUUID()) 
} 

object Guid { 
    def apply[T] = new GuidFactory[Guid[T]] { 
    def apply(id: String) = new Guid[T](id) 
    } 
} 

object UserGuid extends GuidFactory[UserGuid] { 
    override def apply(id: String) = new UserGuid(id) 
} 

val guid1 = Guid[String]("123") 
1

này sẽ giải quyết vấn đề của bạn ?:

package guid 
import java.util.UUID 

abstract class TypeSafeId[I, T](val id: I) extends Serializable  
class Guid[T](override val id: String) extends TypeSafeId[String, T](id) 
class UserGuid(override val id: String) extends Guid[Nothing](id) 

trait GuidFactory[I[A] <: Guid[A]] { 
    def apply[T](id: String): I[T] 
    def apply[T](id: UUID): I[T] = apply(id.toString) 
    def apply[T](ms: Long, ls: Long): I[T] = apply(new UUID(ms, ls)) 
    def apply[T](bytes: Array[Byte]):I[T] = apply(UUID.nameUUIDFromBytes(bytes)) 
    def random[T] = apply[T](UUID.randomUUID()) 
} 

object Guid extends GuidFactory[Guid] { 
    override def apply[T](id: String) = new Guid[T](id) 
} 

//object UserGuid extends GuidFactory[UserGuid] { 
// override def apply(id: String) = new UserGuid(id) 
//} 

object Test { 
    val guid1 = Guid[String]("123") 
    val guid2 = Guid.random[List[Any]] 
    val userguid = Guid("123") 
    val userguid2 = Guid.random 
} 
+0

Không, vì UserGuid cần phải khác với Guid, nếu không nó sẽ bỏ lỡ toàn bộ điểm của một loại id an toàn kiểu ... –

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