AS#開発者向けのC#。 パート3:get、set、sealed、using、const、readonly

画像



AS3からC#への記事の翻訳、パート3:AS3クラスパリティ



本日、C#(AS3開発者の観点から)でのクラスの処理を終了し、AS3に類似性のない概念を理解できる次の記事の準備をします。 現在の記事では、実装方法を検討します。

-ゲッター/セッター(ゲッター/セッター)

-再定義/継承できない関数およびクラス(最終)

-定数

-パッケージ





関数の取得/設定



ゲッターとセッターから始めましょう。 メモリを更新するために、AS3での表示は次のとおりです。



class Person { private var _name:String; public function get name(): String { return _name; } public function set name(n:String): void { _name = n; } }
      
      







そして、これはC#の同等のものです:



 class Person { private String _name; public String Name { get { return _name; } set { _name = value; } } }
      
      







ご覧のとおり、C#では、2つの関数を宣言する代わりに、ゲッターとセッターが単一の変数として宣言されています。 確かに、この変数はセミコロン(;)で終わっていませんが、中括弧の形のブロックを含んでいます。中には2つの部分があります:get {}とset {}。 これらの部分は、getterおよびsetter関数です。 セッター内では、新しいキーワード値にアクセスできます。これは、設定する必要がある値を表し、AS3で行う必要があったので、宣言する必要はありません。 この構文の違いを無視すると、ゲッターとセッターはC#とAS3で同じように機能します。



C#は、そのような関数に省略表記を使用する機能を提供し、単純な関数に余分なコードを書くことを回避します。



 class Person { public String Name { get; set; } }
      
      







この構成を使用すると、上記の例のように、_name変数とgetter / setter関数が自動的に作成されます。 しかし、セッター関数が必要ない場合はどうでしょうか? 削除するだけです:



 class Person { public String Name { get; } }
      
      







ほとんどの場合、Personクラスでこの変数の値を設定できるようにするために、少なくとも必要があります。 このため、セッターはプライベートとして宣言できます。



 class Person { public String Name { get; private set; } }
      
      







それでも、C#の用語の一部:getおよび/またはset関数(名前)を持つクラスフィールドは、「プロパティ」と呼ばれます。 このデータ(_name)を保存するために使用される変数は、「ヘルパーフィールド」と呼ばれます。



最終機能/密閉機能



次に、オーバーライドできない最終関数(AS3)について説明します。



 class Person { final function print(): void { trace("I'm a Person"); } } class MyPerson extends Person { // illegal override function print(): void { trace("I'm not just a Person, I'm a MyPerson too"); } }
      
      







C#は、単語sealを使用して同一の機能を提供します。



 class Person { sealed void Print() { Debug.Log("I'm a Person"); } } class MyPerson extends Person { // illegal override void Print() { Debug.Log("I'm not just a Person, I'm a MyPerson too"); } }
      
      







パッケージと名前空間



AS3のパッケージ:



 package com.jacksondunstan.examples { class Person { } }
      
      







C#では、パッケージは名前空間と呼ばれ、それだけです。



 namespace com.jacksondunstan.examples { class Person { } }
      
      







.asファイル内のパッケージにアクセスするには、パッケージをインポートできます。



 import com.jacksondunstan.examples; class Printer { function print(person:Person): void { trace("person has name: " + person.name); } }
      
      







C#では、名前空間にusingキーワードを使用します。



 using com.jacksondunstan.examples; class Printer { void Print(Person person) { Debug.Log("person has name: " + person.name); } }
      
      







定数と読み取り専用変数



そして最後に、定数について話しましょう。 AS3で宣言後に変更できないフィールドを作成する方法は次のとおりです。



 class Person { private static const MIN_TEEN_AGE:int = 13; private static const MAX_TEEN_AGE:int = 19; var age:int; function IsTeen(): Boolean { return age >= MIN_TEEN_AGE && age <= MAX_TEEN_AGE; } }
      
      







C#で行う方法は次のとおりです。



 class Person { private const int MinTeenAge = 13; private const int MaxTeenAge = 19; int Age; bool IsTeen() { return Age >= MinTeenAge && Age <= MaxTeenAge; } }
      
      







重要なニュアンス:定数のC#では、基本型(たとえば、int)と文字列のみを使用できます。 これが必要なのは、そのようなフィールドは実際には存在せず、代わりに、使用される場所にかかわらず、このフィールドの値が置換されるためです。 また、これは、そのようなフィールドが自動的に静的(静的)になり、静的として個別に宣言する必要がないことを意味します。 コンパイル後、C#のPersonクラスは次のようになります。



 class Person { int Age; bool IsTeen() { return Age >= 13 && Age <= 19; } }
      
      







AS3では、constキーワードはコンパイル段階での検証にのみ使用され、コードの変更や置換にはつながりませんでした。 C#で同様の動作を実現したい場合、または非基本データ型(Personなど)を使用する必要がある場合は、readonlyキーワードを使用する必要があります。



 class Person { static readonly Person Newborn = new Person(0); readonly int Age; Person(int age) { Age = age; } }
      
      







上記の例では、2つの読み取り専用フィールドがあります。



1)新生児-staticキーワードで宣言されたフィールド(定数とは異なり、読み取り専用フィールドは必ずしも静的ではありません)。 このフィールドは、宣言された場所で初期化されます(AS3の定数と同様)。



2)年齢-読み取り専用だが静的ではないフィールド。 コンストラクタで初期化されます。



結論として、C#およびAS3コードの記述された機能の比較:

 //////// // C# // //////// // Collection of classes being used by this file using org.apache.coolstuff; // Collection of classes namespace com.jacksondunstan.examples { class Person { // Complex getters and setters private String _name; String Name { get { return _name; } set { _name = value; } } // Simple getters and setters int Age { get; set; } // Read-only field readonly int ID; // Inlined field const int AdultAge = 18; // Function that can't be overridden sealed void Print() { Debug.Log("Name: " + name + ", ID: " + ID); } } }
      
      





 ///////// // AS3 // ///////// // Collection of classes being used by this file import org.apache.coolstuff; // Collection of classes package com.jacksondunstan.examples { class Person { // Complex getters and setters private var _name:String; function get name(): String { return _name; } function set name(value:String): void { _name = value; } // Simple getters and setters // {not supported. use complex instead.} // Read-only field const var ID:int; // Inlined field // {not supported. use compile-time constants via command-line instead.} // Function that can't be overridden final function print(): void { trace("Name: " + name + ", ID: " + ID); } } }
      
      









次の記事では、最終的にAS3に類似物がない概念の検討を開始します。



チャンネルを切り替えないでください!



All Articles