2015-08-05 15 views
5

Tôi có đoạn mã sau:Force lớp trẻ để thực hiện phương pháp riêng

public abstract class NavEntityController<ChildEntity> where ChildEntity : NavObservableEntity 
{ 
    public abstract void Delete(ChildEntity line); 
    public abstract void Update(ChildEntity line); 
    public abstract void Create(ChildEntity line); 

    public void PushChangesToNav(NavObservableCollection<ChildEntity> lines) 
    { 
     foreach (var line in lines) 
     { 
      line.ErrorLastAction = false; 
      EntityState previousState = line.CurrentState; 

      try 
      { 
       switch (line.CurrentState) 
       { 
        case EntityState.Unchanged: 
         break; 
        case EntityState.NeedsCreate: 
         Create(line); 
         line.CurrentState = EntityState.Unchanged; 
         break; 
        case EntityState.NeedsUpdate: 
         Update(line); 
         line.CurrentState = EntityState.Unchanged; 
         break; 
        case EntityState.NeedsDelete: 
         Delete(line); 
         line.CurrentState = EntityState.Deleted; 
         break; 
       } 
      } 
      catch (Exception e) 
      { 
       //... 
      }   
     } 
    } 
} 

Tôi cần một lớp cơ sở kế thừa từ lớp này, như ví dụ:

public class NavJobController : NavEntityController<NavObservableJob> 
{ 
    public NavJobController({} 

    public override void Delete(NavObservableJob line) {//Implementation here} 
    public override void Update(NavObservableJob line) {//Implementation here} 
    public override void Create(NavObservableJob line) {//Implementation here} 

    //Other functionality 
} 

Tuy nhiên, tôi không muốn một người nào đó để có thể làm:

NavJobController j = new NavJobController(); 
j.Create(new NavObservableJob()); 

nhưng chỉ muốn các phương pháp sau đây:

j.PushToNav(); // và bất kỳ chức năng công cộng nào khác trong lớp cơ sở có sẵn

Về cơ bản, tôi muốn buộc trẻ thực hiện các hoạt động CRUD mà không để lộ chúng ra công chúng. Cú pháp lý tưởng Tôi đã hy vọng là những điều sau đây:

private abstract void Delete(ChildEntity line); 
private abstract void Update(ChildEntity line); 
private abstract void Create(ChildEntity line); 
+2

Sử dụng 'abstract' bảo vệ. –

Trả lời

13

Đây là lý do tại sao protected tầm nhìn tồn tại (có thể nhìn thấy cả lớp cơ sở và các lớp học có nguồn gốc, nhưng không công bố rộng rãi để sử dụng chúng từ một ví dụ).

Nếu bạn cần truy cập công khai các phương pháp này ở đâu đó trong giải pháp, bạn có thể cần sử dụng internal thay vì protected và hiển thị nội bộ cho một số cụm sử dụng thuộc tính [InternalsVisibleTo].

+0

Tôi luôn tránh được bảo vệ vì điều này: http://stackoverflow.com/questions/3182653/are-protected-members-fields-really-that-bad .. Bây giờ tôi đã đọc lại và chỉ xem nó áp dụng cho các thuộc tính – David

+1

@David Đây chỉ là một ý kiến. –

+0

@David câu trả lời đó được phóng đại rất nhiều. Không có gì sai với các thành viên được bảo vệ, hoặc ít nhất không nhiều hơn các thành viên công cộng. – CodeCaster

1

Cách thực hiện việc này là sử dụng protected abstract. Điều này cho thấy các phương pháp cho các loại hậu duệ, nhưng không phải cho người ngoài, cũng như thực thi rằng một số hậu duệ phải triển khai phương pháp.

Vì vậy, đây là cách bạn sẽ khai báo nó:

public abstract class NavEntityController<ChildEntity> where ChildEntity : NavObservableEntity 
{ 
    protected abstract void Delete(ChildEntity line); 
    protected abstract void Update(ChildEntity line); 
    protected abstract void Create(ChildEntity line); 

    ... rest of class 
Các vấn đề liên quan