2009-11-20 39 views
8

Vì lớp trừu tượng không thể khởi tạo được, tại sao các nhà thầu được phép?C# Làm rõ lớp trừu tượng

Tôi nghĩ, trong trường hợp tôi cần chuyển thông tin đến lớp cơ sở (lớp trừu tượng trong lớp này), tôi cần phải có hàm tạo. I .. có nghĩa là

 abstract class Person  
    { 
     string regNo,name; 

     public Person(string regNo,string name) 
     { 
      this.regNo = regNo; 
      this.name = name; 
     } 

     public string RegNo 
     { 
      get { return regNo; } 
     } 

     public string Name 
     { 
      get { return name; } 
     } 

    } 

    class student : Person 
    { 
     student(string regno, string name) 
      : base(regno, name) 
     { 
     } 
    } 

đây có phải là mục đích mà người xây dựng được phép bên trong lớp trừu tượng không?

+0

nếu không có thành viên nào của lớp cơ sở là trừu tượng, thì đâu là điểm cho phép Người trừu tượng? – Benny

Trả lời

18

Mặc dù nó không thể được khởi tạo trên riêng của mình, một lớp trừu tượng có thể có các hàm tạo sẽ được gọi bởi các hàm tạo của các lớp dẫn xuất của nó.

Điều này đặc biệt hữu ích cho việc khởi tạo các thành viên được bao gồm trong chính cơ sở. (tức là khi hàm tạo của lớp dẫn xuất bao gồm tham chiếu đến "base()").

Và thực sự như Jason Down nhắc nhở chúng ta, một lớp luôn có một hàm tạo mặc định ít tham số được cung cấp, nếu một hàm tạo như vậy không được định nghĩa rõ ràng.

+2

Đừng quên quá, rằng ngay cả một lớp trừu tượng sẽ có một constructor không có đối số tạo ra cho nó tự động nếu bạn không tạo ra một mình. –

2

Udanamehar, Lý do chính mà tôi sử dụng tóm tắt là tôi đã xác định thực thể đó là thứ mà tôi sẽ sử dụng lại một chút. Vì vậy, tôi có thể viết một số mã như:

public class Student : Person 
{ 
    public int StudentID { get; protected set; } 

    public Student(int studentID, string regNo,string name) : base(regNo,Name) 
    { 
     this.StudentID = studentID; 
    } 

} 

Tôi muốn nói như sau: "... Tất cả học sinh là Người" do đó chúng tôi có mối quan hệ 'là' với điều đó được thể hiện rõ ràng. Tôi đã không thực sự biên dịch và kiểm tra ví dụ trên. . nhưng bạn hiểu ý rồi đấy.

Hy vọng điều này sẽ hữu ích. . .

+1

Cảm ơn bạn rất nhiều. –

1

Trong một cảm giác đơn giản, lập trình viên lười biếng, và sự lười biếng là đức hạnh của sự sáng tạo và hiệu quả, Tôi muốn tất cả các hoạt động xây dựng chung cho tất cả các lớp thừa kế của một cơ sở/siêu lớp được đặt thường trong cơ sở/siêu lớp.

Trong hình minh họa sau đây, tất cả nhân viên được cung cấp chăm sóc sức khỏe và tiền lương nhưng không phải tất cả nhân viên đều có cùng một khía cạnh chuyên môn.

abstract class Employee{ 
    public Employee(){ 
    setHealthCare(); 
    setSalary();} 

    ....} 

class Programmer:Employee{ 
    public Programmer(){ 
    setLanguages();} 
    ....} 

class BeanCounter:Employee{ 
    public BeanCounter(){ 
    setBeans();} 
    ....} 
1

Bạn có thể sử dụng hàm tạo trong lớp trừu tượng để triển khai logic cụ thể cho nó. Ví dụ, bạn sẽ khởi tạo các trường riêng trong hàm tạo đó, đặc biệt nếu chúng không phải là các giá trị mặc định, vì lớp dẫn xuất không thể nhìn thấy các trường riêng tư nữa.

Một hàm tạo với một hoặc nhiều đối số trong lớp trừu tượng cũng có thể khởi tạo hành vi của lớp trừu tượng theo một cách nào đó quan trọng. Chủ yếu là bạn sẽ thấy rằng nó được khuyến khích để bọc những quá tải constructor trong lớp dẫn xuất của bạn.

gì thực sự là một chút khó chịu hoặc thậm chí là một lỗ hổng thiết kế trong C# (hoặc toàn bộ .NET CLI có thể) là bạn có thể định nghĩa một công constructor trong một lớp trừu tượng, vì nó luôn luôn là một cách hiệu quả bảo vệ sau đó trong trường hợp đó. Tôi cho một người luôn tuyên bố các nhà xây dựng lớp trừu tượng của tôi được bảo vệ (hoặc ít hiển nhiên hơn nếu cần thiết).

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