2010-07-26 38 views
5

tôi không thể làm điều nàyLàm cách nào để triển khai giao diện một cách rõ ràng bằng phương pháp ảo?

interface InterfaceA 
{ 
    void MethodA(); 
} 

class ClassA : InterfaceA 
{ 
    virtual void InterfaceA.MethodA() 
    // Error: The modifier 'virtual' is not valid for this item 
    { 
    } 
} 

Trường hợp công trình sau đây

class ClassA : InterfaceA 
{ 
    public virtual void MethodA() 
    { 
    } 
} 

Tại sao? Làm thế nào để phá vỡ điều này?

+1

Tại sao bạn muốn phá vỡ nó? Lợi ích nào được thêm vào? –

+0

@Eric Nó sẽ tiết kiệm cho tôi một số gõ –

+0

Làm thế nào không được phép đánh dấu một phương thức giao diện rõ ràng là ảo khiến bạn gõ nhiều hơn? –

Trả lời

8

Tôi nghĩ rằng điều này là do khi một thành viên là thực hiện một cách rõ ràng, nó không thể được truy cập thông qua một lớp thể hiện, nhưng chỉ thông qua một thể hiện của giao diện.

Vì vậy, tạo điều gì đó 'ảo' thực sự không có ý nghĩa trong trường hợp này, vì ảo nghĩa là bạn có ý định ghi đè lên nó trong lớp được kế thừa. Việc triển khai giao diện rõ ràng là làm cho nó virtual sẽ là mâu thuẫn. Mà cũng có thể là lý do tại sao trình biên dịch không cho phép điều này.

Để làm việc xung quanh nó, tôi nghĩ csharptest.net's hoặc Philip's câu trả lời có vẻ như nó sẽ làm các trick

+0

Giải thích tốt là tại sao nó không có ý nghĩa để muốn điều đó. – user276648

0

Bạn không thể sử dụng công cụ sửa đổi ảo với static, abstract, riêng hoặc sửa đổi ghi đè. modifier mặc định là tin

+0

Điều thú vị cho việc triển khai rõ ràng công cụ sửa đổi là công khai, mặc dù nó chỉ có thể được truy cập nếu cá thể được truyền đến kiểu giao diện tương ứng. –

3

Theo ngôn ngữ C# spec:

Đó là một lỗi thời gian biên dịch cho một thành viên giao diện rõ ràng triển khai để bao gồm quyền truy cập công cụ sửa đổi và đây là lỗi biên dịch để bao gồm các công cụ sửa đổi tóm tắt, ảo, ghi đè hoặc tĩnh.

Bạn có thể "tìm hiểu" nó chỉ bằng cách gọi phương thức ảo của bạn từ việc triển khai giao diện rõ ràng.

3

Bạn phải làm một cái gì đó như thế này:

interface InterfaceA 
{ 
    void MethodA(); 
} 

class ClassA : InterfaceA 
{ 
    void InterfaceA.MethodA() 
    { MethodB(); } 

    protected virtual void MethodB() 
    { 
    } 
} 

Thông thường đây là một cách tiếp cận tốt hơn anyway như phương pháp nội bộ có thể thay đổi chữ ký mà không thay đổi giao diện. Hãy hơn ví dụ chữ thật:

interface IOrderDetails 
{ 
    void PlaceOrder(); 
} 

//Sometime later you extend with: 
interface IOrderDetails2 : IOrderDetails 
{ 
    void PlaceOrder(IUser user); 
} 

//Implementation 
class Order : IOrderDetails, IOrderDetails2 
{ 
    static readonly IUser AnonUser; 

    void IOrderDetails.PlaceOrder() 
    { OnPlaceOrder(AnonUser); } 
    void IOrderDetails2.PlaceOrder(IUser user) 
    { OnPlaceOrder(user); } 

    protected virtual void OnPlaceOrder(IUser user) 
    { 
    } 
} 

đây bạn có thể xem như là IOrderDetails2 đã được bổ sung chúng ta có thể an toàn Refactor phương pháp ảo hiện có (do đó tạo ra thời gian biên dịch lỗi cho Mục từ). Ngoài ra, điều này thường cho phép bạn cung cấp chức năng phổ biến, ghi nhật ký và xử lý ngoại lệ trong lớp triển khai cơ sở ...

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