1 (изменено: serzh82saratov, 2020-04-30 21:46:44)

Тема: AHK: Class Delete

Не понимаю почему __Delete не вызывается.
Если строку с ObjBindMethod(this, "method") удалить или заменить на Func("method"), то всё работает.


ex := new class1() 
ex.func.Call()
Return

class class1
{ 
	__New()
	{  
		; this.func := Func("method")
		this.func := ObjBindMethod(this, "method")  
	} 
	__Delete()
	{
		MsgBox % A_ThisFunc 
	}
	method()
	{
		MsgBox % A_ThisFunc 
	}  
}

method()
{
	MsgBox % A_ThisFunc 
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Class Delete

Кода используется связка ObjBindMethod(this, ...), возникает циркулярная ссылка на this, поэтому при освобождении ex не все ссылки на него удаляются.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Class Delete

Опять я в справке недочитал...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Class Delete

Обойти можно так:

ex := new class1() 
ex.func.Call()
Return

class class1
{ 
   __New()
   {  
      this.NC := new this.NestedClass
      this.func := ObjBindMethod(this.NC, "method")  
   } 
   __Delete()
   {
      MsgBox % A_ThisFunc 
   }
   class NestedClass {
      method()
      {
         MsgBox % A_ThisFunc 
      }  
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Class Delete

Это понятно, но нужен метод class1. Пока сохраняю в обычном массиве.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Class Delete

serzh82saratov пишет:

нужен метод class1

А какая разница? Если нужно использовать при вызове метода какие-то поля из class1, можно просто передать их во встроенный класс при создании его инстанса.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Class Delete

Начал править уже созданный класс, придётся переписывать прежние вызовы.

Сохранил результаты ObjBindMethod в обычный массив.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Class Delete

А возможно вызывать class1.method из вложенного класса не указывая имя class1?
Нет какой то ссылки на родительский класс?


ex := new class1() 
ex.func.Call()
Return

class class1
{ 
   __New()
   {  
      this.NC := new this.NestedClass
      this.func := ObjBindMethod(this.NC, "method")  
   }  
   method()
   {
      MsgBox % A_ThisFunc 
   } 
   class NestedClass {
      method()
      { 
         class1.method()
      }  
   }
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Class Delete

Нет, вложенный класс ничего не знает о родительском. А зачем такой перекрёстный огонь нужен? Класс придуман, чтобы инкапсулировать какой-то функционал.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Class Delete

Думаю как правильнее должно быть.
Родительский класс нужен, чтобы его имя можно было изменить только в одном месте.
Инкапсуляция, просто чтобы всё было в рамках одного объекта, ну и чтобы имена классов не пересеклись с другими классами или переменными.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Class Delete

serzh82saratov пишет:

Сохранил результаты ObjBindMethod в обычный массив.

С этим тоже возникли неудобства и глюки.
Так вроде всё норм.
Непонятно конечно почему ObjBindMethod так работает, и им нельзя нормально воспользоваться.


ex := new class1() 
ex.func.Call() 
Return

class class1 { 
	__New() {   
		Class := this.__Class
		this.func := ObjBindMethod(%Class%, "method", &this)  
		this.param := 123
	} 
	method(hThis) {
		this := Object(hThis) 
		MsgBox % A_ThisFunc  "`n" this.param
	} 
	__Delete() {
		MsgBox % A_ThisFunc 
	} 
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui