Properties and inheritance
Monkey Forums/Monkey Bug Reports/Properties and inheritance
| ||
Hi,Strict Class A Private Field _value:Int Public Method value:Void(newValue:Int) Property _value = newValue End Method value:Int() Property Return _value End End Class B Extends A Method value:Void(newValue:Int) Property Print "Changed!" Super.value(newValue) End End Function Main:Int() Local b:B = New B() b.value = 42 Print b.value Return 0 End leads to properties.monkey<29> : Error : Unable to find overload for value(). The error disappears when I a) remove the method from B or b) add this code to B Method value:Int() Property Return Super.value() End It would be great if property methods can be used like normal methods for inheritance :) |
| ||
the behavior is the same with methods... |
| ||
Hi, no, IMHO, it's not - because the following example works without any problems: Strict Class A Private Field _value:Int Public Method SetValue:Void(newValue:Int) _value = newValue End Method GetValue:Int() Return _value End End Class B Extends A Method SetValue:Void(newValue:Int) Print "Changed!" Super.SetValue(newValue) End End Function Main:Int() Local b:B = New B() b.SetValue(42) Print b.GetValue() Return 0 End The problem seems to be a special case with properties. The version with manual setter and getter methods, second example, works as expected and only the version with properties, first example but same approach, not. It seems that both property methods (set and get) are expected to be in the same class, if one was found. All the best, Michael |
| ||
It seems that both property methods (set and get) are expected to be in the same class, if one was found. Yes, but it is the same with methods, if they have the same name...So, when overriding a method/property in a derived class, all the overloadings, which the derived class implements, must be overridden. Strict Class A Private Field _value:Int Public Method value:Void(newValue:Int) _value = newValue End Method value:Int() Return _value End End Class B Extends A Method value:Void(newValue:Int) Print "Changed!" Super.value(newValue) End End Function Main:Int() Local b:B = New B() b.value(42) Print b.value Return 0 End while it works in C# as expected. class Class1 { private int _value; public virtual void Value(int value) { _value = value; } public virtual int Value() { return _value; } }; class Class2 : Class1 { public override void Value(int value) { System.Console.WriteLine("Changed"); base.Value(value); } } |