2016-04-22 73 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#委託比匿名/本地/內部類容易得多。