OOPのクラスに関しては、ついにああああの瞬間がありました。私はその考えを理解するのに苦労してきました。取得し始めたので、クラスを拡張する目的は何なのか疑問に思っていました。クラスに別のメソッドを追加する方が簡単ではないでしょうか、それとも要点を逃していますか?
3 に答える
クラスに機能を追加したい場合は、メソッドを追加します。ただし、機能を追加したい場合がありますが、基本クラスではそれができません。
最良の例は、ショーです。クラスにメソッドを追加するRadius
場合、クラスが aCircle
である場合にのみ意味があります。 aRect
には半径がありません。クラスもメソッドを取得するRadius
ため、基本クラスにメソッドを追加しても意味がありません。Rect
Radius
例:
abstract class Shape
{
abstract public function Draw();
}
class Rect extends Shape
{
public function Draw()
{
}
}
class Circle extends Shape
{
public function Draw()
{
}
public function Radius()
{
}
}
これは単純化されますが、実際の例を示します。
コンテンツ管理システム、つまり、ユーザーの入力に基づいて Web サイトにさまざまなページを表示するスクリプトを作成するとします。
おそらく、各ページ (モジュールと呼びましょう) に、そのページ/モジュールで実行できるコマンドなど、特定の機能を持たせたいと思うでしょう。これらの異なるコマンドは、各モジュール クラス内の異なるメソッドになる可能性があります。
しかし、ユーザーが現在 Web サイトのどこにいても、ログイン コマンドを許可するとしたらどうでしょうか。つまり、これはすべてのモジュール間で共有されるコマンドになります。
これに対する解決策は、ログインメソッドが存在する親モジュールクラスを持ち、すべてのモジュールで実行可能にすることで解決できます。
// Your parent class
abstract class ParentModule
{
protected function login()
{
// Login stuff
}
}
// One of your modules
final class ArticleModule extends ParentModule
{
public function submit_article()
{
// An example function
}
}
// Another one of your modules that the user could still login from
final class AnotherModule extends ParentModule
{
public function another_command()
{
// Magic
}
}
コントローラーは次のようになります。
$module = new ArticleModule();
$module->login();
$module->submit_article();
最後に、インターフェースを理解するのに時間がかかりましたが、インターフェースに目を向けると、抽象クラスの利点が再びわかります。実際、抽象クラスの概念を完全に理解すれば、インターフェイスをより簡単に理解できるようになります。
元のクラスが、変更できないライブラリの一部である場合があります。
複数の異なる方法でスーパークラスを拡張したい場合があります。
例 (PHP ではなく Java 構文ですが、考え方は同じです):
class Shape {
abstract double getArea();
}
class Square extends Shape {
double getArea() {
return size * size;
}
}
class Circle extends Shape {
double getArea() {
return radius * radius * Math.PI;
}
}
Shape 型の引数を受け取るメソッドには、Square と Circle を渡すことができます。メソッドは、取得するものを知る必要はありませんが、getArea() を呼び出すことができます。メソッドを単に Shape クラスに追加しただけでは、これは機能しません。