2014-02-20 63 views
1

我正在使用Java將一個程序轉換爲C#,其中我遇到了一些使用接口匿名的問題。請告訴我如何在C#中實現這一點? 這是java中的示例,我們如何爲C#編寫內部匿名?我們如何使用c#接口的內部匿名?

interface Test 
{ 
    public void wish(); 
} 

class Main 
{ 
    public static void main(String[] args) 
    { 
     Test t=new Test() 
     { 
      public void wish() 
      { 
       System.out.println("output: hello how r u"); 
      } 
     }; 
     t.wish(); 
    } 
} 
+0

僅供參考。通常,接口以字母I開頭,在本例中爲ITest。這是知道哪些是接口的好方法。阿米特回答你的問題相當好! ;) –

+0

[在c#中創建接口的實例]的可能的重複(http://stackoverflow.com/questions/17708528/creating-an-instance-of-a-interface-in-c-sharp) – Fried

+0

可能的重複[是否有C#相當於此?](http://stackoverflow.com/questions/15581737/is-there-ac-sharp-equivalent-of-this) – nawfal

回答

1

無法實例在C#中的接口。 C#中的匿名類型基本上只是一組屬性,所以它們不能在其中定義方法,也不能實現接口。

你可以做實現接口的類中,有一個Action場在它的內部,並指定你想調用到現場,像這樣的方法:

using System; 

public interface ITest 
{ 
    void Wish(); 
} 

public class Test : ITest 
{ 
    private readonly Action _wishAction; 

    public Test(Action wish) 
    { 
     _wishAction = wish; 
    } 

    public void Wish() 
    { 
     _wishAction(); 
    } 
} 

class Program 
{ 
    public static void Main(String[] args) 
    { 
     Test t = new Test(() => Console.WriteLine("output: hello how r u")); 
     t.Wish(); 
    } 
} 

或者,你可以只使用lambda:

class Program 
{ 
    public static void Main(String[] args) 
    { 
     Action wish =() => Console.WriteLine("output: hello how r u"); 
     wish(); 
    } 
} 
+0

Thanx @Ray這是工作正常..! –

2

試試這個

public interface Test 
{ 
    public void wish(); 
} 
class Main : Test 
{ 
    public void wish(){ 
    //Your code 
    } 
} 
0

在C#中沒有匿名類與Java中的匿名類相同。

C#的方式做上述將一直使用委託替代一個接口:

public delegate void Wisher(); 

class Main 
{ 
    public static void main(String[] args) 
    { 
     Wisher t =() => Console.WriteLine("output: hello how r u"); 
     t(); 
    } 
} 

根據您的使用情況,你可能會使用System.Action委託類型,而不是一個自定義的委託類型。

1

你必須implementTest接口在另一類說MyTest。然後只需要實例化MyTest類並將其分配給Test實例的實例。請看下面的代碼:

interface Test 
{ 
    void wish(); 
} 

class MyTest : Test 
{ 
    public void wish() 
    { 
     System.out.println("output: hello how r u"); 
    } 
} 

static class Program 
{ 
    [STAThread] 
    static void main() 
    { 
     Test t=new MyTest(); 
     t.wish(); 
    } 
} 
0

可悲的是,C#doesn't allow匿名類來實現同樣的方式Javadoes

即Java代碼接口:

Test t = new Test(){ 
    public void wish(){ ... 
} 

是 '僞C#' 等價到

​​

哪一個當然不會編譯。

正如其他人所說的,你需要在一個命名類上實現接口並實例化它(儘管直接在Main上直接實現接口也不是我的第一選擇)。 )。

+0

抱歉,但是上面提到的任何解決方案都不起作用,因爲當我實現接口「Test」時,不同類中的wish方法有差異實現。任何方式我試圖解決這個代表或lambda表達式。 –

+0

是的,所以每個不同的匿名類實現都需要有自己的(名爲)實現「ITest」的類。如果wish是接口上的ONLY方法,並且如您所說,如果匿名類不需要調用方法之間的狀態,那麼Lambda實現將是一個很好的轉換。 – StuartLC