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);
}
}
|