2016-04-22 39 views
-2

我不知道我想怎么去解决我的问题。这是关于Android可以实例化接口。我正在尝试在C#中完成。现在我确信Java和C#的规则是你不能像所说的那样创建一个抽象和接口的实例。C#vs JAVA实例界面

但我真的很想知道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()你将自动获得接口的覆盖方法。类似于C#中的自动实现接口的方法。

我希望我的问题有意义。

+0

我不明白你在问什么。你在谈论IDE的代码完成功能吗? –

+2

这被称为匿名类。 https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html – dharms

+0

不,不关于代码完成。在android中。这是一种非常普遍的做法。例如'swipeRefreshLayout.setOnRefreshListener(new SwipyRefreshLayout.OnRefreshListener(){'我们实例化了一个新的Interface.OnRefreshListener – Aizen

回答

5

C#不支持匿名自动实现的接口,因为它有代表

public void Foo(Func<string> func, Action action) {} 

// call it somewhere: 
instance.Foo(() => "hello world",() => Console.WriteLine("hello world")); 

与代表可以填补这一空白,它甚至比实施与匿名类的接口更加强大。

Learn more about delegates

+0

我对代表有所了解。我可以使用一种新的Structure方法进行编码,我们可以对代理做很多方法,但在我的层面上,我最终试图寻找使用它非常乏味而不是使用非委托方法的直接代码。感谢您的链接Matias – Aizen

+1

委托相当于Java 8 lambda表达式,但不等同于具有多个抽象方法的接口和抽象类的匿名类。 – Andreas

+0

@Andreas我从来没有说过它是相同的。我的回答告诉OP,C#不支持这个功能,但它提供了代表。我相信我没有错,是吗?:D –

0

你的意思是这样的?

pulic interface Foo{ 
    void DoSomething(); 
} 

public class Bar : Foo { 
    public void DoSomething() { 
     //logic here 
    } 
} 
+0

'override' ??????? –

+0

嗯不,那是继承合同我的问题是关于创建一个实例。你需要添加虚拟,如果你需要重写的方式。 – Aizen

+0

@Matias:当然你是完全正确的。修复。记住:总是读两遍你写的:) – Malte

0
myFunc(new Checkme(){ 
    @Override 
    public void Test() 
    { 


    } 
    @Override 
    public void Test2() 
    { 


    } 
}); 

你传递myFunc的()的东西,一个匿名类。当它说“新的Checkme(){....}”时,它定义了Checkme接口的匿名实现。所以,它不是接口本身的一个实例,只是一个实现它的类型的实例。

+1

lambda不是匿名类,反之亦然。只有一个抽象方法,lambda可以用作任何类/接口的匿名类的替代方法。当多于一种方法是抽象的时候不能使用Lambdas,就像这里的情况一样。 – Andreas

+0

我的错误,将编辑出Lambda。我不知道两者之间有任何正式的区别。 –

1

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

如果您已经声明此:

public interface ISomeInterface 
{ 
    void DoSomething(); 
} 

然后你加个班:

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

在界面上单击鼠标右键,Visual Studio将让你实现接口的选项,它会将所有接口的成员添加到该类中。

+0

这是正确的Scott Hannen,其实你可以使用CTRL +。如果你想要热键快捷方式。但我的问题是关于创建接口的实例。在你的答案上,你从它继承。如果我的问题误导你回答这个问题,我很抱歉。 – Aizen

4

这是一个Anonymous Class

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

匿名类是内联实现的无名类。

你也可以用Local Class做到这一点,但那些在野外很少见到。

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

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

作为第三种选择,您可以使用Inner Class

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

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

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

如果内部类不需要访问外部类的字段,则可以将其声明为static,使其成为Static Nested Class

所以,所有3种方式上面都非常相似。前两种是第三种Java短手,即由编译器实现的句法糖

C#可以做第三个,所以对C#来说就这么做吧。

当然,如果该接口只有一个方法,使用Java 拉姆达或C#委托比匿名/本地/内部类容易得多。