2012-05-16 3 views
2

Я немного новичок в PHP OOP, поэтому мне нужны, ребята, помощь здесь. Я пытаюсь понять, когда использовать абстрактную функцию внутри абстрактного класса.Простая абстрактная концепция класса

, например

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'; 
    } 

} 

ответ

2

Абстрактный класс - это класс, который никогда не имеет смысла создавать (создавать экземпляры), например, если ваши классы были «Бигл» и «Терьер», «Собака» на самом деле не имеет смысла.

Цвет и тип волос применимы только к «Бигл» и «Терьер», но не «Собака», правильно? Таким образом, это было бы абстрактным на уровне Собаки.

Любой метод, применимый только к одной породе, вообще не существует в «Собаке».

numberOfLegs будет иметь реализацию на уровне «Собака» (не абстрактно), и дети могут просто наследовать его (ничего не говоря о нем).

Обратите внимание, что если вы создавали настоящие собаки, то породы станут абстрактными - также если вы создавали настоящие собаки, им, возможно, пришлось бы переоценить число очков, чтобы учесть отдельных собак, которые имели несчастные случаи.

Если вы новичок в OO, однако, могу ли я сделать предложение? Держите все наследование до минимума, делайте это только тогда, когда вам действительно нужно. Кажется, что, когда хороший программист «Gets» OO, их первая мысль заключается в том, чтобы связать все с одним гигантским деревом объектов - это не очень хорошо работает. Вам лучше использовать инкапсуляцию вместо того, чтобы распространяться почти каждый раз.

+0

очень ясно. Спасибо большое. – Rouge

1

Вы делаете метод аннотации, если нет разумного поведения по умолчанию, все подклассов могут использовать, если они выберут или переопределить, если они пожелают.

1

Когда вы определяете абстрактную функцию внутри класса (которая также должна быть объявлена ​​абстрактной), это означает, что эта функция должна быть реализована внутри классов, расширяющих этот абстрактный класс.

Вы можете определить абстрактную функцию, если функциональность будет сильно отличаться или зависеть от класса, расширяющего абстрактный класс.

1

Будет ли функция входа в систему одинаковой для всех пользователей? Если это так, то оно должно быть реализовано как можно ниже (в этом абстрактном классе).

Если пользователь будет иметь несколько типов пользователей, каждый из которых нуждается в разных функциях входа, то оставьте его абстрактным и реализуйте его по-разному в каждом реализующем суперклассе для нужд каждого типа Пользователя.

0

Абстрактный класс - это договор между абстрактным классом и всеми классами, которые наследуются от абстрактного класса.

Разница между абстрактным классом и интерфейсом заключается в том, что интерфейс не реализует какой-либо метод, а только сигнатуры методов.

Когда вы наследуете абстрактный класс, вы должны реализовать все абстрактные методы. Все остальные абстрактные методы, вы наследуете его, остальное вы продлеваете, как в нормальном классе