Does C# have the notion of private and protected inheritance?

前端 未结 10 1091
执笔经年
执笔经年 2020-12-16 09:02

Does C# have the notion of private / protected inheritance, and if not, why?

C++


class Foo : private Bar {
 public:
   ...
 }; 
         


        
10条回答
  •  渐次进展
    2020-12-16 09:33

    I know this is an old question, but I've run into this issue several times while writing C#, and I want to know...why not just use an interface?

    When you create your subclass of the 3rd party framework's class, also have it implement a public interface. Then define that interface to include only the methods that you want the client to access. Then, when the client requests an instance of that class, give them an instance of that interface instead.

    That seems to be the C#-accepted way of doing these sorts of things.

    The first time I did this was when I realized that the C# standard library didn't have a read-only variant of a dictionary. I wanted to provide access to a dictionary, but didn't want to give the client the ability to change items in the dictionary. So I defined a "class DictionaryEx : Dictionary, IReadOnlyDictionary where V : IV" where K is the key type, V is the real value type, and IV is an interface to the V type that prevents changes. The implementation of DictionaryEx was mostly straightforward; the only difficult part was creating a ReadOnlyEnumerator class, but even that didn't take very long.

    The only drawback I can see to this approach is if the client tries to dynamically cast your public interface to the related subclass. To stop this, make your class internal. If your client casts your public interface to the original base class, I think it'd be pretty clear to them that they're taking their life in their own hands. :-)

提交回复
热议问题