1

Тема: AHK: Передать instance (this) родительского класса из дочернего.

Приведу абстрактный код:


class Test1
{
	__new(callback)
	{
		this.Test2.callback := callback
	}

	method()
	{
		ObjBindMethod(this.Test2, "method").call()
	}

	class Test2
	{
		method()
		{
			this.callback.call(this) ; как мне передать this указывающий на Test1?
		}
	}
}

test := new Test1(func("testFunc"))
test.method()


testFunc(classInstance)
{
	msgbox, % classInstance.__class ; Хочу тут получить Test1
}

Мне необходимо вызвать callback функцию во вложенном классе, и при этом передать instance родительского класса (Test1). При этом мне нужно не потерять работоспособность метода `__delete()`, то есть у нас не получится сделать так:


class Test1
{
	__new(callback)
	{
		this.Test2.callback := callback
	}

	method()
	{
		ObjBindMethod(this.Test2, "method", this).call()
	}

	class Test2
	{
		method(instance)
		{
			this.callback.call(instance)
		}
	}
}

test := new Test1(func("testFunc"))
test.method()


testFunc(classInstance)
{
	msgbox, % classInstance.__class
}
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

2

Re: AHK: Передать instance (this) родительского класса из дочернего.

Phoenixxx_Czar пишет:

мне нужно не потерять работоспособность метода `__delete()`

А где там метод __delete() ?

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

3

Re: AHK: Передать instance (this) родительского класса из дочернего.

Представьте, что там он есть, со вторым кодом же не вызовет метод __delete.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

4

Re: AHK: Передать instance (this) родительского класса из дочернего.

А зачем представлять, просто напишите сразу полный код.

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

5 (изменено: Phoenixxx_Czar, 2022-09-02 23:57:34)

Re: AHK: Передать instance (this) родительского класса из дочернего.

Удалено.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

6

Re: AHK: Передать instance (this) родительского класса из дочернего.

Но этот код невозможно запустить.
 
 https://i.imgur.com/HMcZlLb.png
 
Приведите просто минимально возможный код, наподобие того, что в первом посте, только чтобы продемонстрировать проблему.

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

7

Re: AHK: Передать instance (this) родительского класса из дочернего.

Думаю что-то такое, но я не знаю как получить this от Test1:

#Persistent
#SingleInstance FORCE

class Test1
{
	__new(callback)
	{
		this.Test2.callback := callback
	}

	__delete()
	{
		this.stop()
		tooltip, % "Удалено"
	}

	start()
	{
		timerObj := this.timerObj := ObjBindMethod(this.Test2, "method")
		setTimer, % timerObj, 500
	}

	stop()
	{
		timerObj := this.timerObj
		setTimer, % timerObj, delete
	}

	class Test2
	{
		method()
		{
			this.callback.call(this, "one")
		}
	}
}

test := new Test1(func("testFunc"))
test.start()
sleep, 1700
test := ""


testFunc(instance, param)
{

	toolTip, % instance.__class "`n" param
}

Это если я пытаюсь передать this в objBindMethod:

#Persistent
#SingleInstance FORCE

class Test1
{
	__new(callback)
	{
		this.Test2.callback := callback
	}

	__delete()
	{
		this.stop()
		tooltip, % "Удалено"
	}

	start()
	{
		timerObj := this.timerObj := ObjBindMethod(this.Test2, "method", this)
		setTimer, % timerObj, 500
	}

	stop()
	{
		timerObj := this.timerObj
		setTimer, % timerObj, delete
	}

	class Test2
	{
		method(instance)
		{
			this.callback.call(instance, "one")
		}
	}
}

test := new Test1(func("testFunc"))
test.start()
sleep, 1700
test := ""


testFunc(instance, param)
{

	toolTip, % instance.__class "`n" param
}
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

8

Re: AHK: Передать instance (this) родительского класса из дочернего.

В данном случае можно передать указатель на this:

#Persistent
#SingleInstance FORCE

class Test1
{
   __new(callback)
   {
      this.Test2.callback := callback
   }

   __delete()
   {
      this.stop()
      tooltip, % "Удалено"
   }

   start()
   {
      timerObj := this.timerObj := ObjBindMethod(this.Test2, "method", &this)
      setTimer, % timerObj, 500
   }

   stop()
   {
      timerObj := this.timerObj
      setTimer, % timerObj, delete
   }

   class Test2
   {
      method(pInstance)
      {
         this.callback.call(Object(pInstance), "one")
      }
   }
}

test := new Test1(func("testFunc"))
test.start()
sleep, 1700
test := ""


testFunc(instance, param)
{
   toolTip, % instance.__class "`n" param
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Передать instance (this) родительского класса из дочернего.

Получается я внутри testFunc могу обратиться к instance и вызвать допустим instance.stop(), правильно?

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

10

Re: AHK: Передать instance (this) родительского класса из дочернего.

А почему нет?

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