C#vs JAVA接口实例

我不确定我怎么回答我的问题。 它是关于Android可以实例化接口。 我想用C#做。 现在我很确定Java和C#的规则是你不能创建一个抽象和接口实例。

但我真的很想知道Android是如何做到这一点的。

在Android中,您可以执行此操作。

public interface Checkme{ void Test(); void Test2(); } public void myFunc(Checkme my){ //do something } // Now this is the actual usage. public void Start(){ myFunc(new Checkme(){ @Override public void Test() { } @Override public void Test2() { } }); } 

实际上,一旦你在new Checkme()上按Enter键,你将自动获得界面的覆盖方法。 就像C#中接口的auto实现方法一样。

我希望我的问题有道理。

C#不支持匿名自动实现的接口,因为它具有委托

 public void Foo(Func func, Action action) {} // call it somewhere: instance.Foo(() => "hello world", () => Console.WriteLine("hello world")); 

使用代理可以填补空白,它可以比使用匿名类实现接口更强大。

了解有关代表的更多信息 。

这是一个匿名类 :

 public void Start(){ myFunc(new Checkme() { @Override public void Test() { } @Override public void Test2() { } }); } 

匿名类是内联实现的未命名类。

您也可以使用本地类来完成它,但这些在野外很少见。

 public void Start(){ class LocalCheckme implements Checkme { @Override public void Test() { } @Override public void Test2() { } } myFunc(new LocalCheckme()); } 

这两者都具有以下优点:只要它们(有效地)是最终的,它们就可以直接使用方法参数和变量。

作为第三种选择,您可以使用内部类来完成 。

 private class InnerCheckme implements Checkme { @Override public void Test() { } @Override public void Test2() { } } public void Start(){ myFunc(new InnerCheckme()); } 

内部类不能访问方法变量(显然因为它在方法之外),但可以由多个方法使用。

但是,该方法中的任何本地值都可以传递给构造函数并存储为内部类的字段,以获得相同的行为。 只需要更多的代码。

如果内部类不需要访问外部类的字段,则可以将其声明为static ,使其成为静态嵌套类 。

所以,所有3种方式都非常相似。 前两个只是第三个Java缩写,即编译器实现的语法糖

C#可以做第三个 ,所以就这样做C#。

当然,如果接口只有一个方法,那么使用Java lambda或C# delegate要比Anonymous / Local / Inner类容易得多。

如果我理解正确,那么您将定义一个实现接口的类,当您指定该类实现接口时,您希望它自动添加接口的方法和属性。

如果您已声明:

 public interface ISomeInterface { void DoSomething(); } 

然后你添加一个类:

 public class MyClass : ISomeInterface // <-- right-click { } 

右键单击界面,Visual Studio将为您提供实现界面的选项,它将把所有界面的成员添加到该类中。

你的意思是这样的?

 pulic interface Foo{ void DoSomething(); } public class Bar : Foo { public void DoSomething () { //logic here } } 
 myFunc(new Checkme(){ @Override public void Test() { } @Override public void Test2() { } }); 

您将传递给myFunc()一些称为匿名类的东西。 当它说“new Checkme(){….}”时,它定义了Checkme界面的匿名实现。 因此,它不是接口本身的实例,只是实现它的类型的实例。