Pass Operators to Constructors
BlitzMax Forums/BlitzMax Programming/Pass Operators to Constructors
| ||
Is there a way for a constructor to receive data. IE, when using something like:Test:TMyType = New TMyType Would there be a way to say pass an operator into the constructor so the Method New() would look something like: Method New(X:Float, Y:float) End Method Is this possible? |
| ||
| You can't do it with new but can make your own constructor called Create for example. |
| ||
| Hey thanks for the reply. How would I do that? Do you mean just a Method called Create that I call once I construct my new type? |
| ||
You'd use a function in the type as methods only work on the current instance.Function Create:TMyType(X:Float, Y:float) Local mt:TMyType=New TMyType <stuff> Return mt End Function |
| ||
| Ahh that works thanks, I tried with a Method but got unpredictable results. I've since read up more on Types and understand em a bit better. |
| ||
There's also this way
Type TMyType
Method Create:TMyType(X:Float, Y:Float)
<stuff>
Return self
End Method
End Type
mt:TMyType = New TMyType.Create()...which I noticed was used in the new docs somewhere. Matter of taste, I suppose. |
| ||
| Arg!? I am 99% sure I tried that and It didnt work. But it works, Thanks! |
| ||
| "mt:TMyType = New TMyType.Create()" this method is messy as it combines new and .create. It would be better to just do "mt:TMyType = TMyType.Create()" and call a function not a method. Hwoever, I sometimes have an Init method and call this once a type has been created (or later if I don't want to destroy and remake the type). |
| ||
| Also you are allocating memory for 2 objects... yes you are throwing the first away, but there is no need to use a method. I totally agree with Grey, have a function to create and an init method. The only issue with calling the function Create() is that if you extend the type and plan on making another Create() function, then the child type must have the same arguments as the parent type.
Type A
Function Create:A()
Local _a:A = New A
_a.Init()
Return _a
End Function
Method Init()
' Do initialization here
End Method
End Type
Type B Extends A
Field s:String
' YOU CAN'T DO THIS... Argument types differ
Function Create:B(_s:String)
Local _b:B = New B
_b.Init(_s)
Return _b
End Function
' YOU CAN'T DO THIS... Argument types differ
Method Init(_s:String)
s = _s
End Method
End Type
Because BlitzMax does not support overloading, I suggest having a Create<Type Name> function and an Init<Type Name> method. Then you can pass what ever arguments you want.
Type A
Function CreateA:A()
Local _a:A = New A
_a.Init()
Return _a
End Function
Method InitA()
' Do initialization here
End Method
End Type
Type B Extends A
Field s:String
' YOU CAN DO THIS!!!
Function CreateB:B(_s:String)
Local _b:B = New B
_b.InitB(_s)
Return _b
End Function
' YOU CAN DO THIS!!!
Method InitB(_s:String)
InitA() ' Don't forget to initialize your parent
s = _s
End Method
End Type
|
| ||
| If only BlitzMax had templates, typecasting, and pointers. If it did It would have to be the best programming language ever. |
| ||
| Also you are allocating memory for 2 objects... yes you are throwing the first away, but there is no need to use a method. No you're not, you're creating one, then running a method on it that initialises some stuff in itself and returns itself. I agree Init's a better name for the method than Create, but I just mentioned it because I saw it in the docs and thought it was interesting you could do that. I prefer a function too. |
| ||
| If only BlitzMax had templates, typecasting, and pointers. If it did It would have to be the best programming language ever. Maybe I don't understand what you mean exactly, but BMax has pointers and (at least to a certain extent) typecasting. |
| ||
| I like the look of the method create. I didn't know you could do that. I've always disliked my create functions. |
| ||
To avoid operator overloading Objective C has a style where the Init name is used followed by a "With" and then a description of the parameters so in BlitzMax you would have something like:
Type TMyType
Method InitWithString:TMyType(a$)
..dostuff
Return Self
End Method
Method InitWithCoords:TMyType(x,y)
..dostuff
Return Self
End Method
End Type
a:TMyType=New TMyType.InitWithString("home")
b:TMyType=New TMyType.InitWithCoords(22,34)
|
| ||
| Isn't that function overloading? This has nothing to do with operators at all ... operator overloading would be
Type Vector
field x:float, y:float
method infix "+":Vector (other:Vector)
return new Vector.create(self.x + other.x, self.y + other.y)
end method
method prefix "-":Vector ()
return new Vector.create(self.x * -1, self.y * -1)
end method
end Type
wouldn't it? (used Eiffel coding style for operator overloading with infix and prefix to expose the following as unary or binary operator) |