1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

抽象クラスについて3分で理解する

Posted at

概要

abstractやprotectedなどが出てきて?となったので物凄いシンプルなコードで理解できるようにまとめてみました。

抽象クラス (abstract class)とは?

abstractは抽象クラスを作成する時に宣言します。
抽象クラスとは直接インスタンス化(new)することができず、必ずスーパークラスとして利用することを保証するものです。
抽象クラス内のメソッドにもabstract宣言を行うことができます。

引用元: サバイバルTypeScript
上記解説通りなのですが、今回はこれについて深掘りしたいと思います。

サンプルコード

sample1.ts
abstract class Parent {
  protected abstract name: string;
  protected abstract age: number;
}
// Cannot create an instance of an abstract class
const user = new Parent({name: bob, age: 30})

「抽象クラスのインスタンスを作成できません」と言われてしまったので新しい継承クラスを作りたいと思います。

sample2.ts
abstract class Parent {
  protected abstract name: string;
  protected abstract age: number;
}

// Non-abstract class 'Children' does not implement inherited abstract member 'age' from class 'Parent'.
class Children extends Parent {
  public name = 'bob';
}

const user = new Children()
console.log(user)

上記のエラーを見ると「非抽象クラス 'Children' は、クラス 'Parent' から継承された抽象メンバー 'age' を実装していません。」と言われてますね。言葉通りなのでageを追加してみます。

sample3.ts
abstract class Parent{
  protected abstract name: string;
  protected abstract age: number;
}


class Children extends Parent {
  public name = 'bob';
  public age = 30;
}

const user = new Children()
// 30
console.log(user.age)

表示されました。これで解決なのですが、Childrenクラスのpublicをprotectedしたらどうなるのでしょうか・・・?

sample4.ts
abstract class Parent {
  protected abstract name: string;
  protected abstract age: number;
}


class Children extends Parent {
  protected name = 'bob';
  protected age = 30;
}

const user = new Children()
// Property 'age' is protected and only accessible within class 'Children' and its subclasses.
console.log(user.age)

「プロパティ 'age' は保護されており、クラス 'Children' とそのサブクラス内でのみアクセスできます。」とのことらしいです。
(サブクラスとは継承先のクラスのこと)
つまりChildrenやParentのカッコ外ではアクセスできないということですね。色々解決方法はあると思いますが、一番簡単なのは下記の方法ですね

sample5.ts
abstract class Parent {
  protected abstract name: string;
  protected abstract age: number;
}


class Children extends Parent {
  protected name = 'bob';
  protected age = 30;

  public getAge(): number{
    return this.age
  }
}

const user = new Children()
// 30
console.log(user.getAge())

Parentクラスに関数を追加するという手段もできます

sample6.ts
abstract class Parent {
  protected abstract name: string;
  protected abstract age: number;

  public getAge(): number{
    return this.age
  }
}


class Children extends Parent {
  protected name = 'bob';
  protected age = 30;
}

const user = new Children()
// 30
console.log(user.getAge())

抽象クラスって言われると少し難しいように感じますが、短いコードで色々試してみるとちょっとはわかった気がします!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?