Classes
C#もKotlinと同じようにclassの宣言をしますが、ブロック無しのclass宣言はできません。
class Value { }
Constructors
Kotlinにはprimary constructorとsecondary constructorの概念がありますが、C#はconstructorを分類分けするような概念はありません。
また、Kotlinにはconstructorの後に初期化としてinitブロックがありますが、C#にはないのでコンストラクターに処理を書くか、初期化用メソッドを作りそれをコンストラクターで呼び出す必要があります。
class Value { // 型と同じ名前のメソッドのようなブロックがコンストラクターとなる public Value(int value) { } public Value(uint value) { } }
Kotlinのようにコンストラクターの引数でプロパティを宣言することはできません。
Secondary Constructors
Kotlinの: this()
による他のコンストラクター呼び出しはC#にもあります。
class Value { // 型と同じ名前のメソッドのようなブロックがコンストラクターとなる public Value(int value) { } public Value(uint value) : this((int)value) { } }
Creating instances of classes
Kotlinではインスタンス作成にnew演算子は必要ありませんが、C#ではnew演算子によってインスタンスを作成します。構造体や配列の場合でも同じです
class CreateInstance { public Value Create() { return new Value(1); } }
Class Members
C#のクラスのメンバーには以下の要素を含めます。
- コンストラクター
- デストラクター
- メソッド
- プロパティ
- フィールド
- デリゲート
- イベント
- インデクサー
- 演算子のオーバーロード
また、インナーとして型を持つこともできます。
Kotlinには全くない機能としてはフィールドとデリゲートとイベントが挙げられるでしょう。
Inheritance
Kotlinではプロパティ型を除くすべての型はAny
を継承しています。C#では構造体や基本データ型なども含めすべての方はobject
を継承しています。
また、用語の違いとしてC#では継承元の型を基底クラス、継承先の型を派生クラスと呼びます。
Kotlinではデフォルトでクラスは派生を認めていません。open
修飾子を付けることで継承が可能になります。
C#はその逆でデフォルトでクラスの派生を認めています。sealed
修飾子を付けることで継承を不可能にします。
sealed class Value { } // コンパイルエラー: sealed修飾子が付いてるので継承できない class KeyValuePair : Value { }
基底クラスのコンストラクターを呼ぶ際は、: base()
で呼び出すことができます。また、引数がある場合やコンストラクターが複数ある場合は、派生クラスのコンストラクターは基底クラスのコンストラクターを呼び出す必要があります。
class Value { public Value() { } } class KeyValuePair: Value { public KeyValuePair() : base() { } }
Overriding Methods
Kotlinではopen
修飾子をメソッドに付けることによって、仮想メソッドとなり、メソッドをオーバーライドすることができました。
C#も同じようにvirtual
修飾子をメソッドに付けることによって、仮想メソッドとなり、メソッドをオーバーライドすることができます。
また、オーバーライドをさせないためにsealed
修飾子を付けることもできます。
class Value { public virtual void Main() { } } class KeyValuePair : Value { public override void Main() { base.Main(); } } class ValuesPair : KeyValuePair { public sealed override void Main() { base.Main(); } } class Values : ValuesPair { // コンパイルエラー: sealedされてるのでオーバーライドできない public override void Main() { base.Main(); } }
Overriding Properties
C#もKotlinと同じようにプロパティをオーバーライドすることができます。
class Value { public virtual string Text { get; } } class KeyValuePair : Value { public override string Text { get; } } class ValuesPair : KeyValuePair { public sealed override string Text { get; } } class Values : ValuesPair { // コンパイルエラー: sealedされてるのでオーバーライドできない public override string Text { get; } }
しかし、getter onlyなプロパティにsetterを生やすことはできないです。
Derived class initialization order
大差ないので割愛。
Calling the superclass implementation
たびたび登場したbase
によって呼び出せるので割愛。
Overriding Rules
直接的には関係ないですが、C#ではinterfaceの明示的な実装ができます。明示的な実装をした場合はその型にキャストしてからでないと呼び出すことができません。
class Value : IValue { public void Main() { } void IValue.Main() { } } interface IValue { void Main(); }
Abstract Classes
まったく同じなので割愛。
Companion Objects
C#にはcompanion objectやobjectといった概念がありません。 同じようにするにはstatic修飾子を付けて静的フィールド/プロパティ/メソッドなどにする必要があります。
また、C#のstatic classはJavaのstatic classと意味が異なり、C#のstatic classは単にclassのメンバーにstatic修飾子を強制させる機能です。