\r\n\r\n
トルティーヤを食べると、味覚受容器のひとつひとつが喜びを歌い出すのです。塩味、甘み、辛み、爽やかさなど、一口ごとに異なる味の組み合わせが楽しめます。一口食べると、新しい素材が組み合わされ、少しずつ味が変わっていきます。
メニューに書かれている材料は知っていても、サルサがどのように作られているかは知らないものです。野菜にかける調味料は、秘伝のブレンドかもしれませんね。しかし、すべての成分を正確に把握する必要はありません。美味しいということがわかれば十分です。
白米などの材料はコンクリートでしょ。その他の要素は抽象的です。サルサとわかっていても、どんな種類なのか?あるいは、誰かに適当にタコスを渡されると、タコス全体が抽象的になってしまう。
継承と同様に、抽象化もオブジェクト指向プログラミングの重要な概念である。どんなものでも、シンプルで予測可能な結果を出すべきだという理論です。また、オブジェクトは共有する必要があるものだけを共有する必要があります。
タコスはひとつと考えることができる。トルティーヤの中には、豆、米、チーズ、サルサなど他のものが入っています。豆はすでに味付けされている場合があります。チーズはミックスでもいい。サルサは、酢で熟成させた唐辛子を混ぜたものでもよいでしょう。
ブリトーのトッピングがどのように作られているかは知らなくてもいい。ホットドッグについては、おそらく知りたくもないでしょう。大事なのは、食べても崩れないこと、そしてとても美味しいことです。
プログラミングのオブジェクトも同じです。オブジェクトをインスタンス化する(クラスから作成する)ときは、屋台のカウンターでケサディヤを注文するようなものです。一部のデータにはアクセスできますが、すべてのデータにアクセスできるわけではありません。関数が正しいデータを返す限り、そのオブジェクトがどのように動作するかを知る必要はない。以下は、JavaScript/Typescriptでのタコ殴りです。
class CheeseBlend { private _ingredients = ["Colby Jack", "Cheddar", "Manchego"]; get ingredients() { return "melted cheese"; }}class SecretSalsa { private _ingredients = ["oni***", "tomatoes", "cilantro", "Guatemalan Insanity Peppers"]; get ingredients() { return "it's a secret"; }}class Burrito { private _beans = "beans"; private _rice = "rice"; private _cheese: CheeseBlend = new CheeseBlend(); private _salsa: SecretSalsa = new SecretSalsa(); get cheese() { return this._cheese.ingredients; } get salsa() { return this._salsa.ingredients; }}let burro = new Burrito();c***ole.log(burro.cheese);c***ole.log(burro.salsa);このコードは、TypeScriptのサンドボックスで使用することができます。
上記の例では、サルサとチーズの成分を抽出しています。まず、特別な成分を隠すためにカプセル化されています。そして、材料を入手するために志願者が追加されます。しかし、これらの成分は、実際のものを抽象的に表現したものを返すに過ぎない。
しかし、抽象化は単なる概念ではなく、クラスも抽象化することができます。これは、クラスが他のクラスを定義することはできても、自分自身をインスタンス化することはできないことを意味します。
レストランに行って席に着き、ウェイターからメニューを渡され、それを開くと、ただ1つのもの、つまり食べ物があると想像してください。
注文できる、食べられる、たぶん食べられない、といった抽象的なもの。
パスタはいかがでしょうか?まあ、かなり特殊な食べ物ですね。パスタやソースがあるかもしれないことは分かっています。でも、パスタはいろいろな種類がありますから、やはり抽象的ですよね。
フェットチーネ・アルフレド」は、料理とパスタの具体例である。授業も同様です。すべてのクラスがインスタンス化されるべきではありません。あるクラスは、他のクラスの構造だけを定義する必要があります。
以下は、抽象的な食品群と子供用マカダミアナッツ群の例である。
abstract class Food { c***tructor(public name: String) {} abstract totalCalories(): number; abstract description(): string; abstract flavor(): string;}class MacadamiaNuts extends Food { c***tructor() { super("One Cup of Macadamia Nuts"); } totalCalories() { return 962; } description() { return "A nut from Hawaii."; } flavor() { return "rich, buttery, and nutty"; }}let nuts = new MacadamiaNuts();c***ole.log(nuts.name)c***ole.log(nuts.description())これがパスワードです。
抽象クラスは、他のクラスがどのように振る舞うべきかを指示します。上記の例では、食品クラスにしたい場合、名前、フレーバー、説明、カロリーにアクセスできる関数を用意する必要があります。
MacadamiaNutsカテゴリは食品を拡張することに注意してください。つまり、MacadamiaNutsは食のルールを守ることに同意しているのです。また、コンストラクタが super.This コマンドを呼び出すことで、コンストラクタが MacadamiaNuts をインスタンス化する前に親クラスがインスタンス化されることにも注意してください。
プログラミングを学んでいる人は、これらのプログラミングゲームでさらに楽しむことができます。
最初、抽象クラスは不要に思えます。結局のところ、オブジェクトを**するために使うことはできません。機能を受け継いでいないのです。関数は、各サブクラスでオーバーライドする必要があります。
抽象クラスが必要とされる理由は、主に2つあります。コードの一貫性を保ち、他の開発者にも一貫したコードを書かせることができるのです。いつも一人で仕事をするわけではありません。チーム全体が同じルールに従う必要があるのです。詳しくは、TypeScriptの抽象クラスのドキュメントをご覧ください。