Абстрактные методы,все понятно(нет)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Абстрактные методы,все понятно(нет)

Сообщение Bombucho » 24.06.2016 20:23:29

И опять всем здравствуйте, сразу опишу задание "Создать базовый класс Геомет.фигура. Свойства класса сделать: имя,периметр,площадь.Методы для получения и установки свойств класса сделать
абстрактными. Создать производный класс «Правильный шестиугольник».Дополнить его свойством длины стороны шестиугольника. Создать методыполучения и установления значения этого свойства. Реализовать в этом классе наследуемые от базового класса методы."
Я опять же открыл книгу по Lazarus(2009г.), старался все делать по ней, вот результат(конечно еще не закончен)
Unit1
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,unit2,
  unit3;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  Figura1:TRectangle;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var q:string;
begin
Figura1:=TRectangle.Create;
s:=Figura1.Info;
label1.Caption:= s ;
Figura1.Free;
end;

end.

Unit2
Код: Выделить всё
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;
  type
  TFigure=class
private
  n:integer;
  p:array of real;
public
  constructor Create; virtual; abstract;
  constructor Perimetr():real;
  function Square():real;virtual; abstract;
  function Name():string;
  function Info:string;virtual; abstract;
  end;

implementation
    function
TFigure.Perimetr():real;
    var
      i:integer;
      s:real;

    begin
      s:=0;
      for i:=0 to n do
      s:=s+p[i];
      Perimetr:=s;
    end;


end.             

Unit3
Код: Выделить всё
unit Unit3;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils,unit2;
type
  TRectangle=class(TFigure)


public
  constructor Create;override;
  function Square():real;    override;
  function Name():real;    override;
  function Info:string;     override;
end;


implementation
     constructor TRectangle.Create;
     var
       n:integer;
        p:array of real;
       begin
    n:=6;
    SetLength(p,n);
    p[0]:=4;
    end;
function  TRectangle.Square():real;
begin
   Square:=(p[0]*p[0])*((3*sqrt(3))/2);
end;

function TRectangle.Info:string;
    begin
      result:='.......'+'со стороной'+n+'см'+'имеет площадь:'+floatTostr((Square())+'см'+' '
      +'и периметр:'+floatTostr((Perimetr())+'см.'+' 'end;
end.


Не понимаю как реализовать свойство класса "имя", если это можно сделать посредством "result:='Шестиугольник'+'со стороной'....", да и вообще, что скажите по реализации?
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

Re: Абстрактные методы,все понятно(нет)

Сообщение vvvch » 24.06.2016 20:39:21

Абстрактный класс, это когда есть хоть один абстрактный метод. Такой класс не создаётся, а является только предком, при попытке создания - ошибка. Абстрактные методы - пусты. Их переопределять потомки. Конструктор абстрактным (или виртуальным) не делают. Не помню, является это ошибкой или нет.
Да, если параметров нет, то скобки не ставятся. Это сишные функции так пишут, а в Паскале по другому.
Проклятый Т9, исправляет....
Последний раз редактировалось vvvch 24.06.2016 20:57:28, всего редактировалось 1 раз.
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Абстрактные методы,все понятно(нет)

Сообщение Bombucho » 24.06.2016 20:53:44

vvvch писал(а):Абстрактный класс, это когда есть хоть один абстрактный метод. Такой класс не создаётся, а является только предком, при попытке создания - ошибка. Абстрактные методы - пусты. Их переопределять потомки. Конструктор абстрактным не делают. Не помню, является это ошибкой или нет.


То есть ничего кроме
Код: Выделить всё
type
  TKvadrat=class(TObject)
private
  FStorona: integer;
  FPloshad:integer;
  FPerimetr:integer;
  procedure Get_Storona(st:integer);

public
  constructor Create(st:integer);
  function info:string;
  function perimetr (st,pe:integer):integer;
  function ploshad (st,pl:integer):integer;
  property Storona :integer read FStorona write Get_Storona;
  end;


не должно быть в родительском классе?
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

Re: Абстрактные методы,все понятно(нет)

Сообщение vvvch » 24.06.2016 21:00:22

Слово abstract пишется после метода, но реализовывать ничего не нужно. В родительском классе.
Вот ты TFigure написал - это у тебя и есть родительский класс.
Ты перепутал, первоначально у тебя класс не был наследником TObject. А TKvadrat - это др. класс кстати который тоже можно сделать абстрактным.
К стати напиши property имя:тип read write если нужно и Нажми Ctrl - Shift - C редактор код за тебя сам напишет. Потом только подправишь.
Последний раз редактировалось vvvch 24.06.2016 21:12:37, всего редактировалось 1 раз.
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Абстрактные методы,все понятно(нет)

Сообщение Bombucho » 24.06.2016 21:12:25

vvvch писал(а):Вот ты TFigure написал - это у тебя и есть родительский класс.


Вот это я понимаю, а суть то в чем, вроде как описал в родительском классе
Код: Выделить всё
Classes, SysUtils;
  type
  TFigure=class
private
  n:integer;
  p:array of real;
public
  constructor Create; virtual; abstract;
  constructor Perimetr():real;virtual; abstract;
  function Square():real;virtual; abstract;
  function Name():string;virtual; abstract;
  function Info:string;virtual; abstract;
  end;


и создал дочерний класс шестиугольник в котором добавил свойство "сторона" и нашел с помощью этого периметр и площадь, вроде все правильно,верно?
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

Re: Абстрактные методы,все понятно(нет)

Сообщение vvvch » 24.06.2016 21:16:30

Суть абстрактных методов в том, что кто-то пишет шаблн класса, который кто-то другой день под себя, дописывая нужные методы, так библиотеки пишутся.
Вот я сейчас не помню, а компилятора под рукой нет, ты поверь, абстрактные методы являются виртуальными по умолчанию или нет. Если да, то слово virtual писать не надо.

И ещё есть один момент, в чистом ООП если после класса ничего нет, то это первый класс в дереве наследования. Но Лазарь да и Дельфи считает первым класс TObject, по этому его методы могут тебе передаться, хотя ты их не писал.
Последний раз редактировалось vvvch 24.06.2016 22:06:43, всего редактировалось 3 раз(а).
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Абстрактные методы,все понятно(нет)

Сообщение Лекс Айрин » 24.06.2016 21:21:48

Bombucho писал(а):Не понимаю как реализовать свойство класса "имя",


подозреваю, что хватит и банального String.

Код: Выделить всё
constructor Create; virtual; abstract;
  constructor Perimetr():real;


Мне вот интересно, а как будут устанавливаться габариты фигур? По идее, это все делается в конструкторе.

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

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

Ах да... уже писали, но все же... убери abstract у конструктора. и что это за метод info?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Абстрактные методы,все понятно(нет)

Сообщение vvvch » 24.06.2016 21:40:10

Ты не абстрагируйся больше чем нужно, не филосовствуй. Программирование - это прикладная математика. Слышишь - прикладная(конкретная для твоего случая), а философию оставь философам. Кроме того мне трудно тебе что-то сказать, много неоднозначности, по этому, как решишь сделать, так и будет. Рекомендация, пробуй больше компилировать, типа "а как поведет себя компилятор в этом случае", только учти, если нет ошибок компиляции это не значит нет логических ошибок, анализируй и пробуй. И еще, я исправляю и дописываю свои сообщения так что читай и предыдущие.
По ООП Гради Буч хорошо пишет, почитай. "Объектно-ориентированный анализ и проектирование".
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Абстрактные методы,все понятно(нет)

Сообщение pupsik » 24.06.2016 22:24:10

Ты не абстрагируйся больше чем нужно, не филосовствуй. Программирование - это прикладная математика.
угу, конешно. :mrgreen:
Есть доля истины. Но только доля. У каждого свой способ и он его предпочитает. Зачем навязывать другим?

Bombucho вот какие то странные вопросы у вас. И очень частые. У меня 5 вариантов:
1. Задание намбе 1 не полностью было раскрыто и препод решил вас "подтянуть".
2. Задание намбе 1 - перебор. п.1 - последнее.
3. Вы делаете ещё кому то.
4. Вы насолили преподу и вам "светят" сапоги.
5. Свой вариант.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Абстрактные методы,все понятно(нет)

Сообщение vvvch » 24.06.2016 22:33:37

pupsik
Я никому ни чего не навязываю! Я говорю только, что надо конкретно подходить к задаче. А то прошлый раз развели тут философию...
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Абстрактные методы,все понятно(нет)

Сообщение Bombucho » 24.06.2016 22:48:41

pupsik писал(а):
Ты не абстрагируйся больше чем нужно, не филосовствуй. Программирование - это прикладная математика.
угу, конешно. :mrgreen:
Есть доля истины. Но только доля. У каждого свой способ и он его предпочитает. Зачем навязывать другим?

Bombucho вот какие то странные вопросы у вас. И очень частые. У меня 5 вариантов:
1. Задание намбе 1 не полностью было раскрыто и препод решил вас "подтянуть".
2. Задание намбе 1 - перебор. п.1 - последнее.
3. Вы делаете ещё кому то.
4. Вы насолили преподу и вам "светят" сапоги.
5. Свой вариант.


Я просто выполняю задания которые дал мне препод (при это не объяснив ничего по данной теме) и стараюсь использовать литературу,(Алексеев Е.Р., Чеснокова О.В., Кучер Т.В.
Самоучитель по программированию на Free Pascal и Lazarus
УНИТЕХ ) которая в теории должна расставить все точки на и, но в итоге мне пишут, что код не правильный и из него почти все нужно убрать и что мне остается?()
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

Re: Абстрактные методы,все понятно(нет)

Сообщение vvvch » 24.06.2016 23:03:15

Bombucho писал(а): и что мне остается?

Почитать более фундаментальные книжки, но это потом (для чтения этих книг нужно время), а сейчас, я думаю, надо наскоро изучить учебники по Дельфи (часть ООП), дело в том, что там подробней написано, исторически сложилось так, что первоначально был Дельфи, но он платный, а потом проявился проект Лазарус. По этому более фундаментальные книги для Дельфи, а для Лазарус это просто лень переписывать, ведь принципы те-же, да и литературы по Лазарус мало.
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Абстрактные методы,все понятно(нет)

Сообщение pupsik » 24.06.2016 23:04:03

А то прошлый раз развели тут философию..
да ну ладно... из 9 + стр. около 4-х боле/менее... :roll:
Я просто выполняю задания которые дал мне препод (при это не объяснив ничего по данной теме) и стараюсь использовать литературу
не вяжется что то: преподаватель который только задания раздаёт...
Может вы хоть скажете что с предыдущим заданием?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Абстрактные методы,все понятно(нет)

Сообщение Bombucho » 24.06.2016 23:08:01

pupsik писал(а):Может вы хоть скажете что с предыдущим заданием?


А с предыдущим все хорошо,успешно его защитил.
Bombucho
новенький
 
Сообщения: 37
Зарегистрирован: 18.06.2016 22:02:38

Re: Абстрактные методы,все понятно(нет)

Сообщение pupsik » 24.06.2016 23:13:32

Пойдём иным путём, без учебников: http://www.delphibasics.ru/Abstract.php

Добавлено спустя 4 минуты 48 секунд:
И избавляйте себя от плохой привычки:
Код: Выделить всё
result:='.......'+'со стороной'+n+'см'+'имеет площадь:'+floatTostr((Square())+'см'+' '
      +'и периметр:'+floatTostr((Perimetr())+'см.'+'
. Зачем это в классе?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 75

Рейтинг@Mail.ru