Цитата |
Мне его делать пустым? |
Цитата |
Да. |
Цитата (user_name @ 24.12.2014 - 17:56) |
Допустим у меня есть абстрактный класс и в нем абстрактный метод. Дочерние классы обязаны содержать реализацию этого абстрактного метода. Но что если в каком то из классов мне этот метод не нужен? Мне его делать пустым? Я запутался хд |
Цитата |
Но что если в каком то из классов мне этот метод не нужен? Мне его делать пустым? Я запутался хд |
interface test {
function one();
function two();
}
abstract class test {
abstract function one();
abstract function two();
}
Цитата (Michael @ 24.12.2014 - 17:07) |
mvg, то мы говорили о методе С реализацией, просто там нет кода. Самый признак что надо класс объявлять абстрактным. |
protected function foo(){}
protected abstract function foo(){}
class foo{
protected function foo(){}
}
abstract class foo{
protected function foo(){}
}
class foo{
protected function foo(){}
}
class bar extended foo{}
class baz extended foo{}
class bak extended foo{}
class bal extended foo{}
class baf extended foo{}
Цитата (Arh @ 24.12.2014 - 19:47) | ||
По идее если он есть в абстрактном и он помечен как абстрактный значит нужен, их для того и делают абстрактными чтоб не забывали реализовывать. Мне вот интересно если сделать абстрактный класс, у которого все методы будут абстрактными, будет ли разница если вместо этого класса сделать интерфейс, у которого по умолчанию все методы абстрактные? Если нет, тогда смысл в интерфейсах? interface test { abstract class test { |
Цитата (twin @ 24.12.2014 - 19:44) |
mvg Вообще не факт. На примере того же Yii: есть абстрактный класс CModel и хоть ты тресни, но во всех моделях (а они по архитекткре должны от него наследоваться) придется реализовывать метод attributeNames(). Нужен он или не нужен. И если он не нужен, то будет пустым. И что, по твоей логике нужно перепиливать фреймворк? |
Цитата (twin @ 24.12.2014 - 20:47) |
mvg Наверное ты прав. Все никак не могу принять, что в ООП все нужно сначала усложнить, чтобы потом было проще. Единственно, что не так, так то, что метод attributeNames() применяется не для валидации, а для доступа к результатам модели. И если следовать принципам унификации, этот метод обязателен. |
abstract class TemplateMethod
{
public function exec()
{
$this->firstAlgoritm();
$this->secondAlgoritm();
}
// Обязываем дочерний класс реализовать первый алгоритм
abstract protected function firstAlgoritm();
// Обязываем дочерний класс реализовать второйалгоритм
abstract protected function secondAlgoritm();
}
abstract class TemplateMethod
{
final public function exec()
{
$this->firstAlgoritm();
$this->secondAlgoritm();
}
// Обязываем дочерний класс реализовать первый алгоритм
abstract protected function firstAlgoritm();
// Обязываем дочерний класс реализовать второйалгоритм
abstract protected function secondAlgoritm();
}
Цитата (mvg @ 24.12.2014 - 17:58) |
Усложнять тоже не надо. Надо чтобы все было красиво :-) - наверное для этого объектно ориентированный дизайн (OOD) начал развиваться. |
class PagesModel extends CModel
{
public function getContent($page)
{
return Yii::app()->db->createCommand()
->select('m_title, m_keywords, m_description, text')
->from('{{pages}}')
->where('page = :page', array(':page' => $page))
->queryRow();
}
}
class PagesModel extends CModelСмысл этого демарша один - унифицировать обращение к модели. Оно помогает конечно, когда работает команда над валовым продуктом. Тут спору нет.
{
protected $row;
public function attributeNames()
{
return array(
'm_title' => $this->row['m_title'],
'm_keywords' => $this->row['m_keywords'],
'm_description' => $this->row['m_description'],
'text' => $this->row['text']
);
}
public function getContent($page)
{
$this->row = Yii::app()->db->createCommand()
->select('m_title, m_keywords, m_description, text')
->from('{{pages}}')
->where('page = :page', array(':page' => $page))
->queryRow();
}
}