私は現在、乱雑なコードをDDD(ノート、学習)のパラダイムに分割することを学んでいます。エンティティ(IEntity
,IUser
)はドメイン層であり、データ層(BaseEntity
,User
)で実装されています。データへのアクセスは、リポジトリパターンによるものです。しかし、IUserRepository
をIUser
に返すように定義した場合、返信の署名と一致するように、データレイヤーでUser
をIUser
に手動でキャストする必要があります。Kotlin継承
キャストを避けるにはどうすればよいですか?ありがとうございました。
ドメイン層
interface IEntity
{
var id: Long?
var name: String?
}
interface IUser : IEntity
{
}
interface IBaseRepository<T: IUser>
{
fun get(id: Long): Observable<T?>
}
interface IUserRepository : IBaseRepository<IUser>
{
}
データ層
abstract class BaseEntity() : IEntity
{
@SerializedName("id")
override var id: Long? = null
@SerializedName("full_name")
override var name: String? = null
}
class User() : BaseEntity(), IUser
{
}
interface UserRetrofitApi
{
@GET("user/{uuid}/")
fun get(id: Long): Observable<User?>
}
class UserRepository(private val _api: UserRetrofitApi) : IUserRepository
{
override fun get(id: Long): Observable<IUser?> {
return _api.get(id) as Observable<IUser?> // How to avoid casting here without resorting to generic UserRepository<T: IUser>
}
}
'UserRetrofitApi :: get'には特別な制約がありますか? 'fun get(id:Long):Observable'に変更する必要があります。 –
glee8e
@ glee8e、下記の私の回答をご覧ください。 – DeuS