Why is it that the following is legal C#:
public interface ISomeInterface
{
int SomeProperty
{
get;
}
}
public class SomeClassImplementingInterface : ISomeInterface
{
public int SomeProperty
{
get { return 32; }
protected set {}
}
}
but this is not:
public abstract class SomeAbstractClass
{
public abstract int SomeProperty
{
get;
}
}
public class SomeClassExtendingAbstractClass : SomeAbstractClass
{
public override int SomeProperty
{
get { return 32; }
protected set {}
}
}
The latter results in the following compile-time error:
‘InterfaceAbstractTest.SomeClassExtendingAbstractClass.SomeProperty.set’:
cannot override because
‘InterfaceAbstractTest.SomeAbstractClass.SomeProperty’ does not have
an overridable set accessor InterfaceAbstractTest
What is the reasoning for not disallowing the latter whilst allowing the former?
Because a caller using the interface only cares that an implementer of the interface at least implements the interface’s definition, as @davisoa states, whereas
SomeAbstractClassin your example defines a public contract which states exactly the type, accessibility, and (for properties) readability/writability of members.If you use reflection to get the PropertyInfo of
SomeProperty(from either the base or child class), it needs to resolve that information from somewhere. Allowing the child class to change the readability/writability would be as much of a contract violation as a change in return type or argument list.Imagine for instance: