2017-12-30 29 views
1

最近私はKotlinを見つめてJavaでの経験があります。 Javaでは、親と同じ名前のフィールドを宣言できます。 Kotlinで同じことをすると、エラーname hides member of Super type Userが返されます。私はここで何が欠けていますか? Javaの親クラスの子クラスと同じプロパティを宣言する

public class A { 
    protected String name; 
} 

public class B extends A { 
    String name; 
} 
+1

技術的にはJava *でも*スーパータイプのメンバを隠しますが、Javaのコンパイラではエラーが発生しませんが、おそらく警告が表示されます。 – Powerlord

+0

[Javaとは異なり](https://kotlinlang.org/docs/reference/classes.html#overriding-methods)、Kotlinは、上書き可能なメンバーと上書きするための明示的な注釈を必要とします。 – BakaWaii

答えて

1

ただし、これを行う可能性が1つあります。

open class User(protected open var name: String) 

class TwitterUser(override var name: String) : User(name) 

これは主にプロパティの実装を変更するということだけを考慮する必要があります。 User.nameまたはTwitterUser.nameに別途アクセスすることはできません。それはまったく同じです。

+0

付きオーバーライドすると、nameプロパティはUserクラスのfinalとなります。 – mallaudin

+0

Ohh right。 'name'も開いておく必要があります。 – tynn

1

変更、それ等の

Kotlin

open class User(protected var name: String) 

class TwitterUser(var name: String) : User(name) 

同じ概念、

open class ClassParent(name: String) { 

} 

class ClassChild(name: String) : ClassParent(name) { 

} 

よあなたが元のプロパティの実装を隠しているという問題は、initブロックを使用することができます。check details

+0

私はそれがこのように動作することを知っています。しかし、なぜ上記のコードでエラーが出るのですか? – mallaudin

+0

親のメンバーをオーバーライドする必要があり、親クラスを拡張してこのエラーを表示するため、オーバーライドする必要があります –

+0

@mallaudin最初のエラーは、データクラスがvalプロパティまたはvarプロパティ以外のプライマリコンストラクタにパラメータを持つことができないためです。データキーワードを削除すると、この制限が解除されます。 –

1

スーパークラスに既にnameプロパティがある場合、サブクラスにも自動的にそのサブクラスが割り当てられます。なぜあなたはその子供の中で再びそれを定義しますか?あなたは本当に、そのプロパティをオーバーライドする親の中でそれをオープンにし、子供に無効にする必要がある場合に、それ以外の

open class User(protected var name: String) 
//name is not a val/val! simply passed to the constructor as an argument 
class TwitterUser(name: String) : User(name) 

:それは単にそれを別のプロパティをすることなく、コンストラクタのパラメータとして定義する方が良いでしょう

open class User(protected open var name: String) 
class TwitterUser(override var name: String) : User(name) 
関連する問題