Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

abstract method override in Derived class, how to make private

Hi I have a class "A" with as abstract method

protected abstract List<Contributor> GetContributors(List<SyndicationPerson> contributersList);

I want to override this method in derived class "B" with following conditions

  • It should be private to B class.

compiler does not allow me to declare this Method as private in derived class "B" what is the correct syntax ?

like image 489
Asad Avatar asked Nov 29 '09 18:11

Asad


2 Answers

You can't. That would violate the accessibility level declared in class A. Aside from anything else, it would stop it from being callable by class A! What would you expect to happen if code in class A tries to call the abstract method which you'd somehow overridden with a private implementation?

You can make the main implementation private and then create a protected method which just calls the private one, if you really want to.

Why do you want to make the method private in the first place, when it's designed to be callable from A?

EDIT: Okay, now you've explained in your comment what you want to do, you can't do it. The closest you can come is to pass a delegate to A's constructor - that delegate can refer to a private method. Unfortunately, you can't use "this" when you pass arguments in constructor chains, so you're forced to do something horrible such as writing a static method which takes "this" as its first parameter, effectively... except that it will have to cast it to the right type as well, as the parent can't declare which type it should be. The parent would then call the delegate instead of the protected method.

Note that this would also prevent further derived classes from "overriding" further, which may or may not be desirable.

It's incredibly tortuous, and I'd try to avoid it wherever possible. If you're really worried about what derived classes might do, I'd try to seal the class instead and force people to use composition instead of inheritance. The language doesn't really help you do what you want to here.

like image 182
Jon Skeet Avatar answered Oct 12 '22 13:10

Jon Skeet


As a general OOPS rule, one cannot reduce the visibility of a member when overriding. So going from protected to private is not allowed.

like image 28
Pratik Bhatt Avatar answered Oct 12 '22 15:10

Pratik Bhatt