views:

372

answers:

3

I would like to only implement certain interfaces within other interfaces, I don't want them to be able to be inherited directly by a class.

Thanks in advance!

+6  A: 

You can't do this in C# - any class can implement any interface it has access to.

Why would you want to do this? Bear in mind that by declaring an interface inheritance:

public interface InterfaceA {}
public interface InterfaceB : InterfaceA {}

You're specifying that anything implementing InterfaceB also has to implement InterfaceA, so you'll get classes implementing InterfaceA anyway.

thecoop
Ah, thought this was the case, thanks for clearing it up!
Kukks
public interface InterfaceA {}public interface InterfaceB : InterfaceA {}public interface InterfaceC : InterfaceA {}InterfaceA would hold the common [i]rules[/i] that I would be using in InterfaceB and InterfaceC
Kukks
A: 

The best I can suggest is to put them -- both the top level and the descended interfaces, in a separate assembly, with the base-level interfaces declared as internal, and the interfaces which extend those interfaces as public.

James Curran
Is it then possible to actually implement the top level interfaces, if super-interfaces aren't accessible to the implementing class?
thecoop
A: 

First of all, it doesn't make sense to say "implement within other interfaces" because interfaces can't implement anything.

I can see two flawed ways of doing this, sort of.

  1. Make Animated and NonAnimated abstract classes that implement IAnimation. The concrete class below them can still forcibly override your IAnimation methods with the new operator:

    class SomeAnim : Animated
    {
        public new void Foo() { }
    }
    
  2. Use mixins. Keep IAnimated and INonAnimated as interfaces, but don't put any methods in your interface. Instead define extension methods like this:

    static class Ext
    {
        public static void Foo(this IAnim anim)
        {
            if (anim is IAnimated) // do something
            else if (anim is INonAnimated) // do something else
        }
    }
    

again, a bit of a hack. But what you're trying to do indicates design flaws anyway.

Tesserex
re code formatting, see here: http://meta.stackoverflow.com/questions/19624/bug-in-markdown-formatter/19799#19799You need to indent your code by 8 spaces rather than 4
thecoop
thanks, i wonder when that got changed...
Tesserex