ООП: доступ к методу класса из-вне

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

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

ООП: доступ к методу класса из-вне

Сообщение resident » 22.05.2016 14:03:54

Здравствуйте!
В классе есть функции. Подскажите, как ими воспользоваться вне класса?
Компилятор ругается, что нет к ним доступа вне класса.
Пример:
Код: Выделить всё
program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

type
  TMyClass = class
    public
      function X2(x: integer): integer;
    end;

function TMyClass.X2(x: integer): integer;
  begin
    Result := x * 2;
  end;

var
  y: integer;

begin
  y := TMyClass.X2(y);

end. 
У вас нет необходимых прав для просмотра вложений в этом сообщении.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: ООП: доступ к методу класса из-вне

Сообщение AlphaBlend » 22.05.2016 14:21:16

{сначала надо создать экземпляр класса )))}

Код: Выделить всё
MyClass = class
function myFunction:boolean;
end;
.....

implementation

function myClass.MyFunction:boolean;
     begin
            ......
     end;
{
дальше используется "взятие  адреса" )))

Если необходимо использовать свои процедуры  где-то в событиях , то они должны  иметь типа ,соответсвующий событию ))
то есть TNotifyEvent = procedure (Sender: TObject) of Object; Если в  MyClass добавить такую процедуру
}

myClass = class
   procedure Test(Sender:TObject);
end;

//затем  ее  надо реализовать ...

implemetation

procedure MyClass.test(Sender: TObject);
    begin
        showmessage('test');
    end;

// на  кнопочке  формы  можно потом  написать так ( при клике или еще как-то )


//  создается  глобально )))
var
   my: TMyClass;
// потом   надо "взять адрес" ) 
procedure Button1Click;
begin
    my:=TMyClass.Create;
    Button2.Onclick:=@my.Test;
end;
Последний раз редактировалось AlphaBlend 22.05.2016 14:54:25, всего редактировалось 1 раз.
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Re: ООП: доступ к методу класса из-вне

Сообщение pupsik » 22.05.2016 14:36:44

Код: Выделить всё
var
  y : integer;
  z : TMyClass;
begin
  z := TMyClass.Create;
  y := z.X2(y);

п.с.
resident хм... Пардон но что то "попались" на мелочи вы :D
Или это такой флуд :shock:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: ООП: доступ к методу класса из-вне

Сообщение AlphaBlend » 22.05.2016 14:43:28

а мне казалось , что он знает про конструкторы и про то , что такое классы ))) ай-яй-яй )) :D :D а еще ерничал :):):):)
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Re: ООП: доступ к методу класса из-вне

Сообщение resident » 22.05.2016 14:55:30

Я думал, что форум посетила "богиня". И пользуясь случаем, надеялся на волшебство или хак :)
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: ООП: доступ к методу класса из-вне

Сообщение AlphaBlend » 22.05.2016 14:57:03

:D :D
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Re: ООП: доступ к методу класса из-вне

Сообщение pupsik » 22.05.2016 16:18:32

можно и по другому:
Код: Выделить всё
  With TMyClass.Create do
    y := X2(y); 

или
Код: Выделить всё
y := (TMyClass.Create).X2(y);

А вот как без создания класса увы не знаю :?
Может: волшебство???

п.с.
resident: но вам то описанные варианты знакомы... Поэтому:
Или это такой флуд :shock:
:mrgreen:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: ООП: доступ к методу класса из-вне

Сообщение runewalsh » 22.05.2016 16:45:37

Вместо function использовать class function.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: ООП: доступ к методу класса из-вне

Сообщение pupsik » 22.05.2016 17:24:17

runewalsh если не ошибаюсь: существуют ограничения.
Последний раз редактировалось pupsik 22.05.2016 17:59:29, всего редактировалось 1 раз.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: ООП: доступ к методу класса из-вне

Сообщение resident » 22.05.2016 17:37:24

runewalsh писал(а):class function

Работает! Благодарствую :)
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: ООП: доступ к методу класса из-вне

Сообщение pupsik » 22.05.2016 17:59:10

http://wiki.freepascal.org/extended_class_syntax - интересненько...
и печальненько: http://www.freepascal.org/docs-html/ref/refsu31.html
Волшебства нет. Доступа к классу нет. Или ошибаюсь?

п.с.
Только вот зачем этот огород? Можно обойтись функцией. Зачем её включать в класс?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: ООП: доступ к методу класса из-вне

Сообщение zub » 22.05.2016 22:36:08

>>Или ошибаюсь?
Если экземпляра класса нет, то соответственно и доступа нет. но в классе также можно объявить и классовые переменные - к ним доступ будет.

>>Только вот зачем этот огород? Можно обойтись функцией. Зачем её включать в класс?
чтото вроде пространства имен. иногда полезно.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: ООП: доступ к методу класса из-вне

Сообщение debi12345 » 23.05.2016 01:07:12

Вместо function использовать class function.

Ага - т.н. "статический метод" :) В 99.99% случаев это конструкторы и деструкторы :)

чтото вроде пространства имен. иногда полезно.

Ага, как например наглядно в данном PHP-коде:
Код: Выделить всё
class MONTH {
    /** Construct won't be called inside this class and is uncallable from
     * the outside. This prevents instantiating this class.
     * This is by purpose, because we want a static class. */
    private function __construct() {}
    private static $monthNums = array();
    private static $monthNames = array();
    private static $initialized = false;

    private static function initialize() {
        if (self::$initialized) return;
      self::$monthNums = array(0,1,2,3,4,5,6,7,8,9,10,11,12);
      self::$monthNames = array('== все ==','Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь');
        self::$initialized = true;
    }
    public static function NUMS($index) {
      self::initialize();
      return self::$monthNums[$index];
   }
    public static function NAMES($index) {
      self::initialize();
      return self::$monthNames[$index];
   }
}

обращение :
Код: Выделить всё
$out['months_range'] = MONTH::NAMES($last_month);
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: ООП: доступ к методу класса из-вне

Сообщение pupsik » 23.05.2016 02:56:41

Странная полезность: создать класс и изредка вызывать функции (процедуры), "дергать" переменные....
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: ООП: доступ к методу класса из-вне

Сообщение AlphaBlend » 23.05.2016 07:18:22

не думаю , что можно сравнивать Паскаль с PHP ) Только зачем ? ) Если есть класс , значит должен быть объект ( экземпляр этого класса ) , он должен быть создан и к нему должен быть доступ. Иначе зачем вообще такой класс нужен ?
Для чего же вообще создано ООП ? ) Для облегчения работы программиста , для улучшения читаемости кода ) Зачем усложнять ? ) :roll:
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 254

Рейтинг@Mail.ru