Use an abstract property when you have no default implementation and when derived classes must implement it.
Use a virtual property when you have an implementation in the base class but want to allow overriding.
Use the override
keyword to override a member. Mark the member as sealed override
if it should not be overridden again.
Don’t mark the property as abstract
or virtual
if you don’t want it to be overridden.
Use the new
keyword to hide a non-abstract, non-virtual member (this is rarely a good idea).
How to: Define Abstract Properties
I find that abstract properties often occur in a design which implies that they will have type-specific logic and/or side effects. You are basically saying, “here is a data point that all subclasses must have, but I don’t know how to implement it”. However, properties which contain a large amount of logic and/or cause side effects may not be desirable. This is an important consideration, though there is no fixed right/wrong way to do it.
See:
- Should Properties have Side Effects
- CA1024: Use properties where appropriate
Personally, I find that I use abstract methods frequently but abstract properties rarely.