Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Философия программирования > Abstract class не андестенд


Автор: Logree 28.1.2008, 00:19
Здравствуйте уважаемые.. не мог бы кто дать пример где явно показан случай в котором  использование абстрактных классов рациананально.... ну ни как я не могу понять  зачам их использовать... они дают ещё какие нибудь приимущества кроме экономии памяти?

Автор: skyboy 28.1.2008, 00:51

M
skyboy
я думаю, это вопрос - в общем по ООП, потому как концепция абстрактных классов не является уникальным достоянием PHP. Потому едем в "Философию программирования"


Добавлено через 4 минуты и 52 секунды
вообще, прелесть абстрактных классов - в первую очередь, далеко не в экономии памяти. А именно в абстрагировании. Они - это крайний случай предков нескольких разных по логике, но схожих по интерфейсу классов. К примеру, абстрактный класс "передвижной объект" с единственным методом "двигаться в точку" относится и к человеку, и к автомобилю. Несмотря на то, что в остальном эти классы различаются радикально. И чтоб иметь возможность передвинуть объект, независимо от того, какого класса он, можно объявить все передвижные объекты наследником класса "передвижной объект". в принципе, неважно, будет ли класс "передвижной объект" числиться абстрактным, или же будет иметь некоторую обощенную логику(к примеру, запрос e глобального объекта "окружающая среда" информации о том, может ли он передвинуться в заданную точку). Просто определение "абстрактный класс" подчеркивает: никакой наследуемой потомками логики нет: только интерфейс.

Автор: 0000 28.1.2008, 15:35
Код

internal abstract class Shape
{
     protected Int32 _x, _y;
     protected Color _color;

     public abstract void Draw();
     public void SetColor(Color color) {_color = color;}
     public void SetLocation(Int32 x, Int32 y) {_x = x; _y = y;}
}
internal class Circle : Shape
{
      public override void Draw() {//отрисовываем
      }
}
internal class Triangle : Shape
{
      public override void Draw() {//отрисовываем
      }
}
internal class Square : Shape
{
      public override void Draw() {//отрисовываем
      }
}



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

Код

Shape[] shapes = new Shape[3];
shapes[0] = new Circle();
shapes[1] = new Triangle();
shapes[2] = new Square();

for(Int32 i = 0; i < shapes.Length, i++)
     shapes[i].Draw();


здесь работает полиморфизм..мы имея лишь общий доступ в фигурам и фактически вызывая метод Draw у класса Shape на деле вызываем переопределенный метод в конкретном классе

Автор: skyboy 28.1.2008, 16:50
вобщем, абстрактные классы просто доводят концепцию полиморфизма до абсолюта: классы могут иметь абсолютно разную логику, но идентичный интерфейс. 

Автор: SaDFromSpb 28.1.2008, 19:47
Цитата(skyboy @  28.1.2008,  16:50 Найти цитируемый пост)
вобщем, абстрактные классы просто доводят концепцию полиморфизма до абсолюта: классы могут иметь абсолютно разную логику, но идентичный интерфейс.  

Скорее они доводят до абсолюта идею о том, что тип (читай, интерфейс) может быть отделен от реализации. А полиморфизм.... полиморфизм.... его вообще три вида бывает... И два из них отнють не в ОО-языках появились.

Автор: chieftain 4.2.2008, 10:11
Если говорить об абстрактных класссах в java, то эти классы собирают в себя наиболее общие методы (функции) и это на самом деле очень удобно, причем в JAVA абстрактный класс может содержать и реальные, а не только объявленные абстрактные методы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)