Как вызвать метод класса имея его указатель?

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

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

Как вызвать метод класса имея его указатель?

Сообщение CRobin » 02.07.2016 09:31:27

Здравствуйте. Есть метод класса MyClass , который принимает один аргумент, целое число и возвращает результат тоже целое число. Необходимо вызвать его из другого модуля как обычную функцию типа
Код: Выделить всё
TFunc = function(arg : integer): integer;


Проблема в том, что компилятор отказывается воспринимать указатель на метод класса MyClass как указатель на функцию, сообщает о несоответствии типов. Обмануть никак не получается, хотя я не понимаю до конца что в этом преступного. Приходится городить костыли в виде функций-переходников, внутри которых находится вызов метода класса. Можно это как то избежать? Важное условие, модуль из которого происходит вызов функции не должен знать о MyClass
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как вызвать метод класса имея его указатель?

Сообщение Лекс Айрин » 02.07.2016 09:40:13

CRobin, вообще-то это основы ООП, что нельзя вызывать метод класса вне класса.

CRobin писал(а):хотя я не понимаю до конца что в этом преступного.


Подобное поведение может разрушить объект (вызвать немотивированное поведение). Итак программисты слишком вольно обращаются с объектами/классами наплевав на инкапсуляцию.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как вызвать метод класса имея его указатель?

Сообщение CRobin » 02.07.2016 09:47:33

В моем случае этот метод ничего не пишет, только читает. Разве нет никакого способа выкрутится?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как вызвать метод класса имея его указатель?

Сообщение Лекс Айрин » 02.07.2016 09:53:13

CRobin Как я понимаю, один есть -- property .

http://pascal-study.blogspot.ru/2012/05 ... st_03.html
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как вызвать метод класса имея его указатель?

Сообщение Kemet » 02.07.2016 09:57:14

Лекс Айрин писал(а):вообще-то это основы ООП, что нельзя вызывать метод класса вне класса.
Можно. Это зависит от архитектуры языка.
В Модуле-3, например, это вообще не проблема, так как метод - это простая процедура с определенной сигнатурой, которая становится методом только после соответствующих указаний. И можно вызывать и как P(T, x, y, z); и как T.P(x,y,z);
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: Как вызвать метод класса имея его указатель?

Сообщение Лекс Айрин » 02.07.2016 10:09:19

Kemet не путай реализацию принципов с самими принципами.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как вызвать метод класса имея его указатель?

Сообщение CRobin » 02.07.2016 11:14:34

Лекс Айрин писал(а):CRobin Как я понимаю, один есть -- property .

http://pascal-study.blogspot.ru/2012/05 ... st_03.html


Путем жутких извращений с указателями удалось решить задачу. Спасибо.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как вызвать метод класса имея его указатель?

Сообщение MysticCoder » 02.07.2016 11:27:06

Код: Выделить всё
type
  TSomeClass = class
     function SomeMethod(arg : integer): integer;
  end;

  TSomeMethod = function (arg : integer) : integer of object;
...

var
   A : TSomeMethod;
...
   A := SomeClass.SomeMethod;
   // передаем в модуль B
   B.SomeProc(A);



такой метод чем не угодил?
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Как вызвать метод класса имея его указатель?

Сообщение CRobin » 02.07.2016 11:47:47

MysticCoder писал(а):такой метод чем не угодил?


Не знал что так можно. Такой метод конечно решает задачу напрямую без извращений. Большое спасибо.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как вызвать метод класса имея его указатель?

Сообщение resident » 02.07.2016 15:18:33

MysticCoder писал(а):такой метод чем не угодил?

Не удовлетворяет условию задачи:
не должен знать о MyClass
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Как вызвать метод класса имея его указатель?

Сообщение MysticCoder » 02.07.2016 16:27:02

А он ничего и не знает. У него есть указатель на класс, но он ведь не пытается о нем что нибудь узнать. в твоей трактовке, класс должен располагаться в параллельной вселенной, потому что модуль может управлять каким нибудь роботом, который обыщет всю землю и просканирует все жесткие диски и найдет таки информацию о классе.
А автор видимо хотел сказать, что в зависимостях модуля не должно быть модуля в котором обьявлен MyClass. Их и не требуется.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Как вызвать метод класса имея его указатель?

Сообщение zub » 02.07.2016 17:07:39

CRobin
>>Не знал что так можно
Еще стоит обратить внимание на TMethod

resident
>>Не удовлетворяет условию задачи:
Удовлетворяет. Именно так это и делается.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как вызвать метод класса имея его указатель?

Сообщение resident » 02.07.2016 17:23:50

MysticCoder писал(а):автор видимо хотел сказать, что в зависимостях модуля не должно быть модуля в котором обьявлен MyClass

Это твоя личная кривая трактовка.
По-моему задание означает: ничто в модуле не должно знать.
Пример:
"Москва не должна знать о Петербурге" - означает только одно - никто в Москве не должен знать о Петербурге. А по твоему - из Москвы не должно быть прямых дорог в Петербург. (Вот так и реализовали захват Трои конем, когда никто не смотрел на суть. Ворота зарыты, всё хорошо, да? )

Добавлено спустя 21 минуту 22 секунды:
zub писал(а):Еще стоит обратить внимание на TMethod

А через него можно получить метод без указателя на класс?
Именно такой о каком ТС спрашивал в первом посте.
Код: Выделить всё
TFunc = function(arg : integer): integer;
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Как вызвать метод класса имея его указатель?

Сообщение MysticCoder » 02.07.2016 18:13:32

resident писал(а):Это твоя личная кривая трактовка.
По-моему задание означает: ничто в модуле не должно знать.


Твоя трактовка тоже твоя личная и весьма кривая. И твои придирки смахивают на желание спорить ради спора.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Как вызвать метод класса имея его указатель?

Сообщение Kemet » 02.07.2016 19:22:39

Лекс Айрин писал(а):Kemet не путай реализацию принципов с самими принципами.
А я и не путаю. Наличие/отсутствие методов (или похожего механизма) не делает ЯП объектно-ориентированным.
Требуется инкапсуляция и наследование, а полиморфизм может быть реализован различными способами.
Например, в классическом Обероне нет методов, но он, тем не менее, относится к ОО языкам.
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru