好的,这可能是一个新手问题。所以道歉。 假设我有一个类有以下方法的类:
public class A
{
public void DoSomething(long x)
{
}
}
现在我想确保调用DoSomething()的任何对象或类必须实现像ISomethingInterface这样的特定接口吗?
有可能在C#中做到这一点吗? 感谢
答案 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()
{
}
}