Абстрактный класс вопрос

Духовность™

Продвинутый новичок
Абстрактный класс вопрос

http://ru.wikipedia.org/wiki/Абстрактный_класс пишет:
Абстрактный класс в объектно-ориентированном программировании — класс, содержащий хотя бы один абстрактный метод
у меня есть класс в иерархии, который я объявил как абстрактный. это класс "промежуточный", между конкретным конечным классом и родительским абстрактным. но в этом "промежуточном" классе у меня нет абстрактных методов. безусловно, я могу этот класс сделать самым обычным, но abstract мне нужен в первую очередь для того, что бы нельзя было по ошибке создать объект этого класса.

вопрос - насколько это верно/не верно держать такие классы, в которых нет абстрактных методов?

PS выглядит он так:

PHP:
<?php
abstract class Module_User_Controller_BackendCommon extends Module_Common_Controller_Common
{
    protected $user;
    protected $user_mapper;

    public function common()
    {
        parent::common();

        $this->user_mapper = new Module_User_Mapper_User();

        if ($id = $this->getRequest()->getRequest('id'))
        {
            if (!Base_Numeric::is_decimal($id))
            {
                $redirect = new Base_Redirect();
                $redirect->setType('alert');
                $redirect->setMessage('bad_id_user');
                $redirect->setRedirectUrl(array('admin', 'user'));
                return $redirect;
            }

            $this->user = $this->user_mapper->findById($this->getRequest()->getRequest('id'));

            if (!$this->user->getId())
            {
                $redirect = new Base_Redirect();
                $redirect->setType('alert');
                $redirect->setMessage('user_does_not_exist');
                $redirect->addParam('id_user', $this->getRequest()->getRequest('id'));
                $redirect->setRedirectUrl(array('admin', 'user'));
                return $redirect;
            }
        }
    }
}
?>
 

Ragazzo

TDD interested
У Фаулера (Фаулер - Рефакторинг) очень хорошо расписано об этом, и вообще какие классы держать, а какие должны "умереть"...
 

Ragazzo

TDD interested
triumvirat
Там много способов выделения класса, переноса метода в другой класс...Советую почитать, книга всего лишь 420 страниц, но знаний прибавиться ощутимо...
P.S сам когда-то решил прочитать, т.к рефакторинг своего тогда г**кода надоел, и хотелось писать красиво, чтобы код был наглядным и удобным...что-то я тут расписался...вообщем Фаулер подскажет...
 

zerkms

TDD infected
Команда форума
Вот почему всегда лучше читать английскую википедию:

In programming languages, an abstract type is a type in a nominative type system which is declared by the programmer. It may or may not include abstract methods or properties...
 

Духовность™

Продвинутый новичок
zerkms
жжешь) Да, замечание в точку.

-~{}~ 30.09.10 03:27:

обратиться за описанием абстрактных классов в русскую википедию это сильно
да откуда я знал, что в русской так написано...

щас исправлю в википедии.

-~{}~ 30.09.10 12:02:

Что за бараны, не пойму в этой википедии? Я разместил ссылку на oracle, как и в англоязычной википедии, а какой-то умник всю правку снес с аргументацией якобы это спам. Пистец, блин. Вахтеры среди нас.
 

Adelf

Administrator
Команда форума
triumvirat
Твоя правка делает определение бессмысленным(просто прочти его еще раз). Либо полностью скопируй определение с английской вики либо отмени.

-~{}~ 30.09.10 12:23:

"Абстрактный класс в объектно-ориентированном программировании — класс, содержащий ноль или больше абстрактных методов и свойств."

"Человек - это существо, содержащее ноль или больше рук и ног."
 

iamFake

Mind Of Liberty
Автор оригинала: triumvirat
человек не может не содержать рук и ног
печально, но это возможно в нашем мире...

p.s. "Абстрактный класс в объектно-ориентированном программировании — класс, содержащий ноль или больше абстрактных методов и свойств." действительно "не умное" определение...
 

Духовность™

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

абстрактный класс может содержать ноль или более абстрактных методов. от этого он не становится ни на каплю хуже. и определение тут уместно такое - "человек может содержать ноль или более волос"

действительно "не умное" определение...
возьмите да перепишите, вот сидят, критикуют.
 

Crys

Двинутый новичок
Ыыы )) Я летом работу искал, проходил собеседования.. На двух конторах был вопрос про абстрактный класс. Первый раз я "ошибся", т.к. правильным ответом оказался "класс, содержащий хотя бы один абстрактный метод". На втором собеседовании я ответил правильно.. с их точки зрения. Но сам подозревал какой-то подвох :) В общем, теперь понятно, откуда ноги росли этих вопросов..
 

Adelf

Administrator
Команда форума
In programming languages, an abstract type is a type in a nominative type system which is declared by the programmer. It may or may not include abstract methods or properties...
Абстрактный класс в объектно-ориентированном программировании — класс, содержащий ноль или больше абстрактных методов и свойств.
Ты разницу то видишь? А про человека я для примера привел. Такое же дурацкое определение.

Блин, кто-то уже подправил.. но тоже не айс:
Абстрактный класс в объектно-ориентированном программировании — класс, являющийся базовым для других классов.

В общем поправил. Моя версия такая:
Абстрактный класс в объектно-ориентированном программировании — класс, который не предполагает создания экземпляров.

Помоему, это единственное, что отличает абстрактный класс от других.

-~{}~ 30.09.10 13:10:

З.Ы. "Абстрактные методы часто являются и виртуальными"

А разве может вообще абстрактный метод не быть виртуальным?
 

Crys

Двинутый новичок
Блин, кто-то уже подправил.. но тоже не айс:
Абстрактный класс в объектно-ориентированном программировании — класс, являющийся базовым для других классов.

В общем поправил. Моя версия такая:
Абстрактный класс в объектно-ориентированном программировании — класс, который не предполагает создания экземпляров.
Это я поправлял. Имхо, твое определение лучше. А то, что я имел ввиду под базовым классом, указано там далее в контексте.
 

StUV

Rotaredom
Если забить на холивар вокруг определения и вернуться к вопросу... я бы все-таки посоветовал не использовать абстрактные классы без абстрактных методов явно указывающих что же абстрактно в ветке наследования.
Запретить наследование можно через исключение в конструкторе базового класса.
Можно делегировать функционал common() в какой-нить тулкит.
Эти варианты или что-то еще явно выделяют функционал в общий.
А код в дизайне примера вводит разработчика в заблуждение и вызывает ненужные вопросы (можно ессно добавить в код камент, но... код от такого использования приобретает ненужную избыточность и добавляет в дизайн неоднозначность).

-~{}~ 30.09.10 15:22:

а по поводу

>> что бы нельзя было по ошибке создать объект этого класса

можно тупо создать объект прямого наследника, отличающегося только именем класса.
И, если в команде найдется такой г-кодер, через пару лет следующее поколение программеров моск сломает над вопросом "нахера?" ;)
 
Сверху