3

OOPのクラスに関しては、ついにああああの瞬間がありました。私はその考えを理解するのに苦労してきました。取得し始めたので、クラスを拡張する目的は何なのか疑問に思っていました。クラスに別のメソッドを追加する方が簡単ではないでしょうか、それとも要点を逃していますか?

4

3 に答える 3

4

クラスに機能を追加したい場合は、メソッドを追加します。ただし、機能を追加したい場合がありますが、基本クラスではそれができません。

最良の例は、ショーです。クラスにメソッドを追加するRadius場合、クラスが aCircleである場合にのみ意味があります。 aRectには半径がありません。クラスもメソッドを取得するRadiusため、基本クラスにメソッドを追加しても意味がありません。RectRadius

例:

abstract class Shape
{
  abstract public function Draw();
}

class Rect extends Shape
{
  public function Draw()
  {
  }
}

class Circle extends Shape
{
  public function Draw()
  {
  }

  public function Radius()
  {
  }
}
于 2012-09-26T20:07:02.767 に答える
2

これは単純化されますが、実際の例を示します。

コンテンツ管理システム、つまり、ユーザーの入力に基づいて 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();

最後に、インターフェースを理解するのに時間がかかりましたが、インターフェースに目を向けると、抽象クラスの利点が再びわかります。実際、抽象クラスの概念を完全に理解すれば、インターフェイスをより簡単に理解できるようになります。

于 2012-09-26T20:38:30.370 に答える
2

元のクラスが、変更できないライブラリの一部である場合があります。

複数の異なる方法でスーパークラスを拡張したい場合があります。

例 (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 クラスに追加しただけでは、これは機能しません。

于 2012-09-26T20:09:09.410 に答える