little heritage problem

Executor

I see you
Reaction score
57
Hi,

actually I think this should be a really simple problem with a really simple solution but somehow it doesnt work.

JASS:
struct Base
   // ?
endstruct

struct Kind1 extends Base
   method processMoveOrder takes destination returns integer
      // implementation
   endmethod
endstruct

struct Kind2 extends Base
   method processMoveOrder takes destination returns integer
      // implementation
   endmethod
endstruct

function someFunc takes nothing returns nothing
   local Base f = 0

   loop
      exitwhen f == someNumber
      
      if f.processMoveOrder(someDestination) > 0 then
         return
      endif

      set f = f + 1
   endloop
   return      
endfunction


I want to loop through all kinds of Bases, but access the methods of their childs. The question is, how do I declare such a method in the parent struct, so that the child creation 'replaces' the method implementation of the parent instance via the index they share.

I hope I could make my problem understandable.

Greetings
 

Executor

I see you
Reaction score
57
Yes, but (refering to my example):

JASS:
if f.processMoveOrder(someDestination) > 0 then
// f = parent type
// => processMoveOrder = 0


vJass heritage is sth like this:

Code:
Parent Struct
   real x
   method sth
      return 0
   endmethod
endstruct

Child Struct
   real x
   method sth
      return 0
   endmethod

   real y
endstruct

I want sth like this:

Code:
Parent Struct
   real x
   method sth 
      return 0
   endmethod
endstruct

Child Struct #1
   real x
   method sth
      return 1
   endmethod
   real y
endstruct

Child Struct #2
   real x
   method sth
      return 2
   endmethod
   real y
endstruct

function someExampleFunction
   local Child1 child1 = Child1.create()
   local Child2 child2 = Child2.create()

   local Parent p = 0

   DebugMsg(child1.sth) // => 1
   DebugMsg(child1.sth) // => 2

   set p = child1

   DebugMsg(p.sth) // => 1

I want the creation of the child to change (permanently) the parents method. I mean as the childstruct ID equals the parentstruct ID (array index).

You could say: Simply use a function interface in the parent struct, which is replaced on creation of the child struct, so you can loop through by f.interfacefunction.evaluate().

But I hate function interfaces and as I don't need ingame dynamic they are overkill.

All in all I think in vJass there is no way to do this and if I want or not, I have to use function interfaces.
 

Trollvottel

never aging title
Reaction score
262
JASS:
struct Elder
   real x
   stub method sth 
      return 0
   endmethod
endstruct

struct Kind1 extends Elder
   real x
   method sth
      return 1
   endmethod
   real y
endstruct

struct Kind2 extends Elder
   real x
   method sth
      return 2
   endmethod
   real y
endstruct


local Elder p = Kind1.create()


try something like this? ( i didnt really get the problem, sry about that)
 

Executor

I see you
Reaction score
57
JASS:
struct Elder
   real x
   stub method sth 
      return 0
   endmethod
endstruct

struct Kind1 extends Elder
   real x
   method sth
      return 1
   endmethod
   real y
endstruct

struct Kind2 extends Elder
   real x
   method sth
      return 2
   endmethod
   real y
endstruct


local Elder p = Kind1.create()

// p.sth will return 0 and not 1
 

Trollvottel

never aging title
Reaction score
262
JASS:
struct Elder
   real x
   stub method sth 
      return 0
   endmethod
endstruct

struct Kind1 extends Elder
   real x
   method sth
      return 1
   endmethod
   real y
endstruct

struct Kind2 extends Elder
   real x
   method sth
      return 2
   endmethod
   real y
endstruct


local Elder p = Kind1.create()

// p.sth will return 0 and not 1
actually this returned 1 for me:

JASS:
scope A initializer I
struct Elder
   real x
   stub method sth takes nothing returns integer
      return 0
   endmethod
endstruct

struct Kind1 extends Elder
   method sth takes nothing returns integer
      return 1
   endmethod
   real y
endstruct

struct Kind2 extends Elder
   method sth takes nothing returns integer
      return 2
   endmethod
   real y
endstruct

function I takes nothing returns nothing
local Elder p = Kind1.create() // Kind created as Elder
call BJDebugMsg(I2S(p.sth()))
endfunction
endscope
 

Executor

I see you
Reaction score
57
I tried "stub", but I could swear it didn't work (I was working on sth. else and recognized bugs. Evading stub helped). Well seems like I have to do some testing.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top