2009-11-09 52 views
22

Tôi có một giao diện đẹp, và tôi muốn thực hiện một thành viên của nó trong một lớp cơ sở để các khách hàng có thể lấy được từ lớp cơ sở và có ít lò hơi-đĩa để viết. Tuy nhiên, mặc dù tuyên bố trừu tượng, trình biên dịch phàn nàn rằng lớp không thực hiện giao diện?!? Làm thế nào điều này nghĩa vụ phải được thực hiện?Trình biên dịch C# phàn nàn rằng lớp trừu tượng không thực hiện giao diện?

Mã trong câu hỏi:

public interface ITaskDefinition 
{ 
    ITask CreateTask(TaskId id); 
    string Name { get; } 
    bool HasName { get; } 
} 

public abstract class TaskDefinitionBase : ITaskDefinition 
{ 
    private string name_ = null; 

    public void SetName(string name) 
    { 
     name_ = name; 
    } 

    public string Name 
    { 
     get 
     { 
      return name_; 
     } 
    } 

    public bool HasName 
    { 
     get 
     { 
      return name_ != null; 
     } 
    } 
} 

và lỗi tôi nhận được là:

ITaskDefinition.cs(15,27): error CS0535: 'NetWork.Task.TaskDefinitionBase' does not implement interface member 'NetWork.Task.ITaskDefinition.CreateTask(NetWork.Task.TaskId)' 
+1

Như một mẹo - cách nhấp vào ITaskDefinition trong lớp trừu tượng và nhấn tổ hợp phím CTRL +. sẽ sửa lỗi này cho bạn. – RichardOD

Trả lời

34

Bạn phải thêm một cuống trừu tượng của phương pháp này:

public abstract ITask CreateTask(TaskId id); 

Inheritors sau đó có thể ghi đè nó để thực hiện giao diện.

+1

Đó là nó, tôi phải sử dụng một cách rõ ràng ghi đè trong việc thực hiện:/Thanks! – Anteru

+1

họ thực sự cần phải thêm một cảnh báo trình biên dịch cụ thể cho trường hợp này –

+0

@Simon_Weaver Họ đã làm cho nó một lỗi *. Nhiều hơn những gì bạn muốn? –

1

TaskDefinitionBase cần bao gồm CreateTask - nếu bạn không muốn triển khai nó, chỉ cần đánh dấu phương thức là trừu tượng để buộc bất kỳ lớp triển khai thực hiện nó.

4

Khi một đối tượng triển khai giao diện, nó phải tuân thủ tất cả các ràng buộc được áp dụng bởi giao diện. Điều này có nghĩa rằng bạn phải thực hiện tất cả các thuộc tính và phương thức được khai báo trong giao diện.

Trong trường hợp của bạn, bạn thiếu triển khai CreateTask. Ngoài ra, bạn nên lưu ý rằng C# sử dụng các thuộc tính như trái ngược với Java ví dụ sử dụng getters/setters. Vì lý do này bạn không cần một phương thức SetName.

Bạn mã nên giống như thế này:

public abstract class TaskDefinitionBase : ITaskDefinition 
{ 
    private string name_ = null; 

    public abstract ITask CreateTask(TaskId id); 

    public string Name 
    { 
     get 
     { 
      return name_; 
     } 
     set 
     { 
      name_ = value 
     } 
    } 

    public bool HasName 
    { 
     get 
     { 
      return name_ != null; 
     } 
    } 
} 
+1

+1 cho việc đề xuất đặt 'SetName' thành một setter thực. –

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