オブジェクト指向とは?
いっぱい記事を読んで、本を読んで。楽しんで、学びましょう。
なぜオブジェクト指向で書くのか?それは、予め頻繁に変更されるであろう箇所をクラスに抽出することで、システムが変更に対して柔軟に対応できるようにするためなのです。
これな。
一回読んで理解できる記事はない。いっぱい実践していっぱい調べて身につけていってください。
オブジェクト指向のキーワード
キーワード | 意味 |
---|---|
Class | オブジェクトの設計図 |
オブジェクト(インスタンス) | クラスから生成された実態 |
継承 | 元のクラスのプロパティやメソッドを引き継いで自分でカスタマイズできる |
オーバーライド | 継承元の元クラスもメソッドを上書きすること |
インターフェース | 抽象クラス。インスタンス化することはできない |
implements | 抽象クラスを実装すること |
コンストラクタ | クラスが生成されるときに呼び出されるメソッド |
デストラクタ | クラスが破棄されるときに呼び出されるメソッド |
具体例
// インターフェース(仕様を決める設計図) // インターフェースにはプロパティを持つことはできない。(メソッドの定義だけ) interface IPerson { getFullName(): string } // インターフェースIPersonを実装 // プロパティに名字・名前を持つ class Person implements IPerson { protected firstName: string; // プロパティは分かりやすい命名規則があったりなかったり。 protected familyName: string; //インスタンス化するとcounstructor()が実行される constructor(familyName: string, firstName: string) { this.familyName = familyName; this.firstName = firstName; } getFullName(): string { return `${this.familyName} ${this.firstName} さん` } } // Personを継承 // getFullNameをオーバーライド class Girl extends Person { getFullName(): string { return `${this.familyName} ${this.firstName} ちゃん` } } // Personを継承 // getFullNameをオーバーライド class Boy extends Person { getFullName(): string { return `${this.familyName} ${this.firstName} くん` } } // new クラス名() でインスタンス化できる const people: Array<IPerson> = [] people.push(new Girl('伊藤', '凛')) people.push(new Person('佐藤', '蓮')) people.push(new Person('鈴木', '樹')) people.push(new Boy('高橋', '律')) people.push(new Girl('田中', '結菜')) people.push(new Person('渡辺', '芽依')) people.push(new Person('山本', '大翔')) people.push(new Girl('中村', '莉子')) people.push(new Boy('小林', '大翔')) people.push(new Person('加藤', '楓')) // 共通のインターフェースを持っているので、ループで回せる(多態性) for (let i = 0; i < people.length; i++) { console.log(people[i].getFullName()) }
多態性の必要性
プリンタで文字を印刷するプログラムを作ってください。
具体的実装(Not 抽象的)
function print(str){ printer = GetCurrentPrinter() if( printer == "CANON-MG7730" ){ ゴニョゴニョゴニョ }else if( printer == "EPSON-カラリオ808A" ){ ゴニョゴニョゴニョ }else if( printer == "CANON-MG7730" ){ ゴニョゴニョゴニョ }else if( printer == "ブラザー-J963N" ){ ゴニョゴニョゴニョ }else if( printer == "CANON-MG3688" ){ ゴニョゴニョゴニョ }else if( printer == "EPSON-708A" ){ ゴニョゴニョゴニョ } }
よし!できた!市場にリリースだ!!!
リリース1週間後…
新しいプリンターが発売しました。
え、新しいプリンタには対応していません。
抽象化設計
- アプリ→OS
API用意しておくから、印刷したかったら、この関数に情報突っ込んで呼んでね
- OS→ドライバ(プリンタメーカーの実装)
アプリから印刷命令受けたら、こういう情報を渡すから、新しいプリンタ発売するときは、ドライバ実装して配布してね。