2010-04-08 48 views
32

Có OK để lấy được một lớp trừu tượng từ một lớp không trừu tượng hoặc có điều gì đó sai trái với cách tiếp cận này không?Lớp trừu tượng bắt nguồn từ lớp không trừu tượng

Here's một chút ví dụ:

public class Task { 
    // Some Members 
} 

public abstract class PeriodicalTask : Task { 
    // Represents a base class for task that has to be done periodicaly. 
    // Some additional Members 
} 

public class DailyTask : PeriodicalTask { 
    // Represents a Task that has to be done daily. 
    // Some additional Members 
} 

public class WeeklyTask : PeriodicalTask { 
    // Represents a Task that has to be done weekly. 
    // Some additional Members 
} 

Trong ví dụ trên tôi không muốn làm cho lớp công tác trừu tượng, bởi vì tôi muốn nhanh chóng nó trực tiếp. PeriodicalTask ​​nên kế thừa chức năng từ Tác vụ và thêm một số thành viên bổ sung nhưng tôi không muốn khởi tạo trực tiếp. Chỉ có lớp dẫn xuất của PeriodicalTask ​​nên được khởi tạo.

Trả lời

49

Tôi không thấy điều gì sai với phương pháp này.

Bạn có thể có một số loại cơ bản có thể được mô tả theo thuật ngữ cụ thể. Bây giờ, chỉ vì một đối tượng thuộc loại này có thể được phân loại thêm theo một số loại phụ, nó không tuân theo tất cả các kiểu con như vậy chỉ là cụ thể; họ có thể lần lượt yêu cầu cụ thể hóa hơn nữa, vì nó đã được.

thực thế giới ví dụ:

Person - bê tông (không trừu tượng)
Sibling: Person - trừu tượng
Brother: Sibling - bê tông
Sister: Sibling - bê tông

+2

Ví dụ hoàn hảo Dan –

+0

Ví dụ tốt do đó được chấp nhận – Jehof

+0

Wow! Thực sự, ví dụ tốt đẹp. – ManuelSchneid3r

0

Sử dụng tóm tắt không phải là cách tiếp cận đúng ở đây, hãy sử dụng một hàm tạo được bảo vệ hoặc nội bộ, ví dụ. Điều đó sẽ ngăn chặn các cá thể của PeriodicalTask ​​được tạo trực tiếp, nhưng các lớp dẫn xuất của nó sẽ vẫn có quyền truy cập vào nó.

+0

Bạn có thể xây dựng không? Có, một nhà xây dựng được bảo vệ/nội bộ có thể ngăn chặn các trường hợp 'PeriodicalTask' được tạo trực tiếp. Nhưng nó cũng sẽ yêu cầu bất kỳ phương thức trừu tượng/thuộc tính nào từ 'Task' để triển khai. –

+0

Đừng bận tâm ... Tôi nhớ rằng Nhiệm vụ không trừu tượng. Cả hai cách tiếp cận này sẽ hoạt động tốt trong tình huống này. Khác thì bạn không thể ép buộc ai đó thực hiện một phương thức trong một lớp dẫn xuất. –

+0

@ kprobst: Vâng tôi có thể làm điều đó, nhưng sau đó tôi mất khả năng xác định thành viên trừu tượng, mà phải được thực hiện bởi các loại có nguồn gốc. Các thành viên ảo không có tùy chọn, khiến các kiểu dẫn xuất phải xác định cách chúng hoạt động như thế nào – Jehof

17

Không có gì sai với nó.

Nếu bạn nhìn vào một hệ thống phân cấp lớn như WinForms, bạn sẽ tìm thấy một số lớp kiểu trừu tượng.

Các tác vụ MSBuild cũng là một ví dụ tốt (và phù hợp hơn).

12

Loại t hing xảy ra tất cả các thời gian: Tất cả các lớp trừu tượng kế thừa từ System.Object, một lớp không phải là abstract của chính nó.

new System.Object() đôi khi hữu ích khi khóa, nếu bạn không có bất kỳ thứ gì khác xung quanh, bạn có thể khóa lại.

+0

Đó là một điểm tốt. Thực tế này tôi bị mất, nguyên nhân thừa kế từ System.Object không được đặt rõ ràng. – Jehof

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