确保只有实现某个接口的类才能调用方法? C#?

时间:2014-09-24 14:50:27

标签: c#

好的,这可能是一个新手问题。所以道歉。 假设我有一个类有以下方法的类:

public class A 
{
    public void DoSomething(long x)
    {
    }
}

现在我想确保调用DoSomething()的任何对象或类必须实现像ISomethingInterface这样的特定接口吗?

有可能在C#中做到这一点吗? 感谢

4 个答案:

答案 0 :(得分:2)

这个问题有点奇怪,因为你试图实现类似于界面场景的东西,但却有点颠倒。

如果你真的只想要实现某个接口的类能够调用某个特定方法,我会用扩展方法强制执行它:

 public static void DoSomething(this IFoo foo, long x)
 {
     ....
 }

现在,您只能通过DoSomething(long x)键入的对象调用IFoo。有关详细信息,请参阅extension methods

当然,等效的解决方案却不那么方便或优雅,只需简单地实现静态方法,如下所示:

 public static void DoSomething(IFoo foo, long x) { ... }

您正在将DoSomething仅从IFoo个对象切换为传递IFoo个对象作为参数。扩展方法本质上是该解决方案的语法糖。

但除非您无法访问IFoo的实施(第三方代码)或更改界面是您无法承受的重大变更,否则这种情况确实没有意义。如果您确实有权访问或可以承担休息时间,那么只需创建DoSomething部分界面即可。这样,所有IFoo个对象都将采用DoSomething方法。

不确定我是否正确理解了您的问题。

答案 1 :(得分:0)

public class A : IA
{
       public void DoSomething(long x)
        {
           }
}

public interface IA
{
     void DoSomething(long x)
}


/*Some method somewhere*/
public void DoThisThing()
{
   IA a = new A();

   a.DoSomething(10);
}

你是在正确的路线上,但它反过来工作。界面告诉你你可以做什么,它就像合同一样。

现在,您可以在其他课程上强制执行合同,确保只能拨打DoSomething

public class B : IA
{
    public void DoSomething(long x)
    {
        // B's custom implementation
    }

    public void IWantSomethingElse(string s)
    { 
        // this is only class specific and cannot be called from the interface
    }
}

/* Some method somewhere */
public void DoThisThing()
{
    IA a = new B();

    a.DoSomething(2);

    // here there is no way to call IWantSomethingElse because the its not on the interface
}

答案 2 :(得分:0)

如果您真的想强制执行用户必须实现接口B的场景(如果他们也有A),那么您只需标记一个接口即可重新实现另一个接口。见MSDN - Interfaces

public interface A
{
   void a();
}

public interface B : A
{
   void b();
}

public class Foo: B
{
    public void a()
    {
    }


    public void b()
    {
    }
}

如果它们没有实现这两种方法,那么这将抛出编译时错误。

答案 3 :(得分:0)

您可能希望使用实现函数的抽象类而不是接口:

public abstract class MyAbstractClass
{
    //This one HAS to be defined in the inheritor class, like an interface
    public abstract void DoSomeOtherThing();

    //This is your function that can only be called by objects that inherit from this class.
    protected void DoSomething()
    {
        //use your protected method here 
    }
}

public class MyClass : MyAbstractClass
{
    public MyClass()
    {
        DoSomething();
    }

    public override void DoSomeOtherThing()
    {

    }
}