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コードの記述された機能の比較:
|
|
次の記事では、最終的にAS3に類似物がない概念の検討を開始します。
チャンネルを切り替えないでください!