2013-07-17 58 views
7

Tôi đang sử dụng giao diện trong C# và thay vì viết một lớp hoàn toàn mới, thực hiện giao diện đó là có thể tạo một đối tượng triển khai giao diện đó? Giao diện được định nghĩa làTạo một thể hiện của giao diện trong C#

public interface ITokenStore 
{ 

    IToken CreateRequestToken(IOAuthContext context); 


    IToken CreateAccessToken(IOAuthContext context); 
} 

Và tôi biết trong java tôi có thể giống như

ITokenStore tokenStore = new ITokenStore() 
    { 
     IToken CreateRequestToken(IOAuthContext context) { 
      IToken requestToken = null; 

      return requestToken; 
     } 

     IToken CreateAccessToken(IOAuthToken context) { 
      IToken accessToken = null; 

      return accessToken; 
     } 
    }; 

Có một cách tương đương để nhanh chóng trong trường hợp của một giao diện trong C#?

+1

Java vẫn đang tạo ra một lớp phía sau hậu trường, nó chỉ là cú pháp đường - và theo một cách nào đó, giải pháp của họ là thiếu các đại biểu/con trỏ hàm. – Dai

+1

Với một khung mocking, bạn có thể tạo một cá thể, ví dụ 'new Mock ()'. Bạn có thể muốn thiết lập việc triển khai cụ thể các phương thức mà khung công tác mocking có thể làm từ một đại biểu. –

+0

có thể trùng lặp của [Có một C# tương đương với điều này?] (Http://stackoverflow.com/questions/15581737/is-there-a-c-sharp-equivalent-of-this) – nawfal

Trả lời

11

Cách duy nhất để "Tạo một thể hiện của giao diện trong C#" là tạo một thể hiện của một loại thực hiện giao diện.

+0

Đó là cách duy nhất? Nó không thể được thực hiện như trong java? – azrosen92

+0

Nó sẽ được biên dịch như một lớp vô danh. –

+6

Không, bạn không thể làm điều này trong .NET/C#, và để rõ ràng, * bạn không thể làm điều đó trong Java, hoặc *. Trình biên dịch làm gì trong Java là xây dựng kiểu ẩn danh cho bạn, một kiểu * thực hiện giao diện *. Vì vậy, Java có một phím tắt để nhận được loại đó, C# không. –

3

Giao diện không có logic trong thiết kế. Họ chỉ đơn giản là không thực sự làm bất cứ điều gì.

Việc khởi tạo một lớp không có lớp triển khai thậm chí không có ý nghĩa

0

Bạn không thể tạo phiên bản giao diện trong C#. Bạn phải tạo một thể hiện của một lớp/kiểu thực hiện giao diện đó.

Có thể muốn đọc lên trên interfaces in C#. Không có cách nào để "giả mạo" nó giống như Java.

Tôi rất tốt nếu bị hấp dẫn bởi khái niệm này mặc dù vì nó là thứ có sẵn bằng ngôn ngữ khác. Tôi cho rằng bạn có thể sử dụng một lớp ẩn danh với các thông số ủy nhiệm nếu người tiêu dùng của bạn biết cách giả mạo duck typing. Nhưng điều đó hầu như không đáng giá.

0

Something như thế này:

public class MyTokenStore: ITokenStore 
{ 
    public IToken CreateRequestToken(IOAuthContext context) 
    { 
     ...some code here... 
    } 
    public IToken CreateAccessToken(IOAuthContext context) 
    { 
     ...some code here... 
    } 
} 

Sau đó sử dụng nó:

ITokenStore x = new MyTokenStore(); 
0

Giống như những người khác đã nói, không có, điều này là không thể.

Tuy nhiên, bạn có thể viết một lớp tổng quát có đại biểu cho mỗi phương pháp. Giống như sau:

public class DelegateTokenStore : ITokenStore 
{ 
    public delegate IToken TokenCreator(IOAuthContext context); 
    public TokenCreator RequestTokenCreator { get; set; } 
    public TokenCreator AccessTokenCreator { get; set; } 

    public IToken CreateRequestToken(IOAuthContext context) 
    { 
     return RequestTokenCreator(context); 
    } 

    public IToken CreateAccessToken(IOAuthContext context) 
    { 
     return AccessTokenCreator(context); 
    } 
} 

Sau đó, bạn có thể sử dụng nó như thế này:

ITokenStore tokenStore = new DelegateTokenStore() 
{ 
    RequestTokenCreator = (context) => 
    { 
     IToken requestToken = null; 
     return requestToken; 
    }, 
    AccessTokenCreator = (context) => 
    { 
     IToken accessToken = null; 
     return accessToken; 
    }, 
}; 

Tôi không nói rằng đó là thiết phải là một ý tưởng tốt để áp dụng cách này. Giống như bất cứ điều gì, sự phù hợp phụ thuộc vào trường hợp sử dụng của bạn.

2

Nếu bạn thực sự muốn điều này:

private static void Main(string[] args) 
    { 
     IFoo foo = new IFoo(); // <- interface 
     foo.Print(); 

     Console.ReadKey(); 
    } 


    [ComImport, Guid("A7D5E89D-8FBD-44B7-A300-21FAB4833C00"), CoClass(typeof(Foo))] 
    public interface IFoo 
    { 
     void Print(); 
    } 

    public class Foo : IFoo 
    { 
     public void Print() 
     { 
      Console.WriteLine("Hello!"); 
     } 
    } 

Nhưng nếu bạn mở biên soạn lắp ráp trên ildasm.exe, bạn sẽ thấy:

IL_0001: newobj instance void TestApp.Program/Foo::.ctor()

1

Theo như tôi biết .NET không có Khái niệm Java của các lớp bên trong vô danh. Có một nhu cầu điển hình cho việc triển khai động của một giao diện trong các kịch bản thử nghiệm đơn vị.Vì vậy, có thể là một cái nhìn trên một số khuôn khổ mocking động có thể rất thú vị cho bạn, ví dụ

  1. Impromptu Interface (bao gồm hỗ trợ cho động)
  2. Moq

Có một cái nhìn về NuGet bộ sưu tập cho các gói được gắn thẻ với chế nhạo.

Các vấn đề liên quan