3

「User」という名前のクラスと、「User」を拡張する「Admin」という名前の別のクラスがあり、Admin にすべての属性メソッドを継承させたい場合、たとえば、__construct メソッドを除きます。

class User {
private $name;

function __construct($name) {
$this->name = $name;
}
}

class Admin extends User {
private $authorization;

function __construct($name,$authorization) {
$this->name = $name;
$this->authorization = $authorization;
}
}

これは正しいです?管理者はユーザーの構築メソッドをオーバーライドしますか? 拡張クラスに同じメソッド名がある場合、それは無効だと思います。クラス拡張のポイントを完全に見逃していますか?

4

3 に答える 3

8

無効ではありません。クラス継承の 1 つの側面は、メソッドをオーバーライドして別の実装を提供できることです。

しかし、あなたの場合、私はそうします

class Admin extends User {
    private $authorization;

    function __construct($name,$authorization) {
        parent::__construct($name);
        $this->authorization = $authorization;
    }
}

親クラスに「名前の割り当て」を既に実装しているためです。よりクリーンなアプローチです。

于 2010-02-15T23:02:12.030 に答える
1

はい、それは拡張するためのものです。すべてのメソッドをオーバーライドできます。

子クラスのメソッド内で同じ名前の親クラスを使用することもできます。

参照:parentキーワード

于 2010-02-15T23:02:03.833 に答える
1

いいえ、ユーザーのコンストラクターをオーバーライドしているため、これは完全に合法です。一般的に言えば、クラスを拡張する際に似た名前のメソッドは、親のメソッドを「オーバーライド」します。

ただし、修飾子がここで役割を果たすことに注意してください。スーパークラスで宣言された「プライベート」メソッドは、クラスを拡張することによって継承されないため、オーバーライドされません。"final" 宣言されたメソッドは、クラスを拡張してオーバーライドすることはできません - いかなる状況でも。

于 2010-02-15T23:02:59.923 に答える