2

私はPHPOOPに少し慣れていないので、ここで皆さんの助けが必要です。抽象クラス内で抽象関数をいつ使用するかを理解しようとしています。

例えば

abstract class User{
    abstract function login();
    //how do I decide if I should make login function as abstract or regular function.              
    abstract function permission();

    function AccountCredit (){
       echo 'show account credits';
    }

}
4

5 に答える 5

2

抽象クラスは、クラスが「ビーグル」や「テリア」の場合のように、実際に作成(インスタンス化)する意味がないクラスです。「犬」は実際には意味がありません。

色と髪型は「ビーグル」と「テリア」にのみ適用され、「犬」には適用されません。したがって、犬レベルでは抽象的です。

単一の品種にのみ適用される方法は、「犬」にはまったく存在しません。

numberOfLegsは「Dog」レベル(抽象的ではない)で実装され、子はそれを継承することができます(それについて何も言わないことによって)。

実際の犬をインスタンス化する場合、品種は抽象化されることに注意してください。実際の犬をインスタンス化する場合も、事故を起こした個々の犬を説明するために、numberOfLegsを上書きする必要がある場合があります。

ただし、OOを初めて使用する場合は、提案をいただけますか?すべての継承を最小限に抑え、本当に強制された場合にのみ実行してください。優れたプログラマーがOOを「取得」するとき、彼らの最初の考えは、すべてを1つの巨大なオブジェクトツリーにリンクすることであるようです。これはあまりうまく機能しないことがわかります。ほぼ毎回拡張するのではなく、カプセル化を使用することをお勧めします。

于 2012-05-16T15:17:14.593 に答える
1

すべてのサブクラスが選択した場合に使用できる、または必要に応じてオーバーライドできる、適切なデフォルトの動作がない場合は、メソッドを抽象化します。

于 2012-05-16T15:14:38.950 に答える
1

クラス内で抽象関数を定義する場合(その場合も抽象として宣言する必要があります)、この関数はこの抽象クラスを拡張するクラス内に実装する必要があることを意味します。

機能が非常に異なる場合、または抽象クラスを拡張するクラスに依存する場合は、抽象関数を定義できます。

于 2012-05-16T15:15:14.063 に答える
1

ログイン機能はすべてのユーザーで同じになりますか?もしそうなら、それは(この抽象クラスで)可能な限り低く実装されるべきです。

複数のタイプのユーザーが存在し、それぞれが異なるログイン関数を必要とする場合は、抽象化したままにして、各タイプのユーザーのニーズに合わせて、実装するスーパークラスごとに異なる方法で実装します。

于 2012-05-16T15:15:54.080 に答える
0

抽象クラスは、抽象クラスと、抽象クラスから継承するすべてのクラスとの間のコントラクトです。

抽象クラスとインターフェースの違いは、インターフェースがメソッドを実装せず、メソッドのシグニチャーのみを実装することです。

抽象クラスから継承する場合は、すべての抽象メソッドを実装する必要があります。抽象メソッドではない残りのすべては、それを継承し、残りは通常のクラスでどのように拡張するか

于 2012-05-16T15:33:48.267 に答える