Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can you ever have too many "protected virtual" methods?

Here's a question for those of you with experience in larger projects and API/framework design.

I am working on a framework that will be used by many other projects in the future, so I want to make it nice and extensible, but at the same time it needs to be simple and easy to understand.

I know that a lot of people complain that the .NET framework contains too many sealed classes and private members. Should I avoid this criticism and open up all my classes with plenty of protected virtual members?

Is it a good idea to make as many of my methods and properties protected virtual as possible? Under what situations would you avoid protected virtual and make members private.

like image 202
cbp Avatar asked Nov 26 '08 00:11

cbp


People also ask

Can a virtual method be protected?

Yes, if you need to call the SaveData of another class, it needs to be accessible from that class - so public or protected . Save this answer. Show activity on this post. NVI (Non-Virtual Interface) requires that virtual methods not be public.

Should all methods be virtual?

No, you should not mark all methods as virtual. You should consider how your class could be inherited. If the class should not be inherited, then mark it sealed and obviously the members should not be virtual. If your class is likely to be inherited, you really should maximize the ability to override the behavior.

What does protected virtual mean?

protected means that it is visible only inside this class and classes derived from it. virtual means that it can be overriden in derived classes. new means that here you create new overriding hierarchy, i.e. you stop overriding the method defined in the base class and replace it with this method.

Can we override private virtual methods?

A private virtual function can be overridden by derived classes, but can only be called from within the base class.


1 Answers

Your class includes data members; methods that perform basic internal operations on those data members where the functionality should never change should always be private. So methods that do basic operations with your data members such as initialization and allocation should be private. Otherwise, you run the risk of "second order" derivative classes getting an incomplete set of behaviors enabled; first derivative members could potentially redefine the behavior of the class.

That all said, I think you should be very careful with defining methods as "protected virtual". I would use great caution in defining methods as "protected virtual", because doing so not only declares the possibility of overriding the functionality, but in some ways define an expectation of overridden functionality. That sounds to me like an underdefined set of behaviors to override; I would rather have a well-defined set of behaviors to override. If you want to have a very large set of overridable behaviors, I would rather look into Aspect Oriented Programming, which allows for that sort of thing in a very structured way.

like image 179
Paul Sonier Avatar answered Sep 29 '22 10:09

Paul Sonier