2010-08-10 43 views

Trả lời

6

Một thiết kế có thể là sẽ sử dụng một constructor tin trên một lớp trừu tượng:

public abstract class BaseClass 
{ 
    private BaseClass(Object param) 
    { 
     //Do something with parameters 
    } 

    //Provide various methods that descendant classes will know how to perform 

    public static BaseClass FromObject(Object value) 
    { 
     //Based on object, choose which type of derived class to construct... 
    } 

    private class HiddenDerivedA : BaseClass 
    { 
     public HiddenDerivedA(Object value) 
      : base(value) 
     { 
     } 
    } 

    private class HiddenDerivedB : BaseClass 
    { 
     public HiddenDerivedB(Object value) 
      : base(value) 
     { 
     } 
    } 
} 

mô hình này rất hữu ích nếu việc triển khai nguồn gốc được chặt chẽ cùng với logic lựa chọn được sử dụng để xây dựng chúng và bạn muốn cung cấp một mức độ cao của vật liệu cách nhiệt từ phần còn lại của mã của bạn. Nó giúp bạn có trách nhiệm phải hỗ trợ những người thừa kế khác ngoài những người bạn dự định rõ ràng và cho phép bạn phơi bày tất cả trạng thái riêng tư từ lớp cơ sở đến các lớp dẫn xuất của bạn.

3
  1. Rất ít. Các nhà xây dựng công cộng chỉ có thể được sử dụng như một bảo vệ.

  2. Có, nó có thể được gọi là ('ngang') với từ khóa this từ các nhà thầu khác (được bảo vệ/công khai).

+0

Trong 2: Bạn có nghĩa là từ khóa "này". "base" nằm trong các lớp dẫn xuất và không thể gọi các ctors riêng. –

+0

@ John: Có, thx. Sẽ chỉnh sửa. –

+0

@John, "cơ sở" có thể gọi các nhà thầu tư nhân nếu kiểu phát sinh là một lớp lồng nhau của kiểu dẫn xuất. –

3

Câu hỏi # 1: Không nhiều. Bạn không thể gọi hàm tạo của lớp trừu tượng (khởi tạo nó) trực tiếp. Bạn chỉ có thể gọi một từ một lớp con, có nghĩa là bạn chắc chắn sẽ có quyền truy cập vào các thành viên được bảo vệ cũng như các thành viên công cộng tại thời điểm đó.

Câu hỏi # 2: Không, không có ý nghĩa nhiều. Một hàm tạo riêng trên một lớp trừu tượng chỉ có thể được gọi bằng "chuỗi hàm tạo" từ một hàm tạo không riêng tư trong cùng một lớp.

+0

# 2 có thể hữu ích. –

+0

@ Henk Holterman - Tôi có thể thấy nó. Sẽ không loại trừ nó ra! –

+2

# 2 - hoặc một hàm tạo từ một kiểu lồng nhau, theo câu trả lời của Dan. –

-1

Có dường như không có nhiều khác biệt với tôi, các kết quả đầu ra mã sau

Foo
Bar

public abstract class Foo 
{ 
    protected Foo() { 
     Console.WriteLine ("Foo"); 
    } 
} 

public class Bar : Foo 
{ 
    public Bar() { 
     Console.WriteLine ("Bar"); 
    } 
} 

void Main() 
{ 
    new Bar(); 
} 

Một constructor trừu tượng không thể được overriden nếu nó được bảo vệ. Không chắc Nếu tôi trả lời câu hỏi của bạn :-)

+1

Không có thứ gì như một "hàm tạo trừu tượng" và bạn không thể ghi đè lên các hàm tạo. –

+0

Điều đó có thể như vậy, nhưng nếu bạn thử mã ở trên bạn sẽ thấy rằng tôi có một hàm tạo trong một lớp trừu tượng thực sự thực thi khi một lớp xuất phát từ nó được tạo ra. –

0

Để làm rõ câu hỏi đầu tiên của mình, tôi sẽ trả lời lại (không có nhận xét). Vì vậy, tôi biết rằng không thể instansite lớp trừu tượng trực tiếp. Chỉ khi một lớp xuất phát từ lớp abstarct, có thể được instansiated. Tôi biết rằng một lớp học có thể có nhà xây dựng như tư nhân, công cộng, nội bộ và cũng được bảo vệ. Những gì bảo vệ có nghĩa là, tôi biết.

Nhưng sự khác biệt giữa công khai một nhà xây dựng được bảo vệ trong lớp trừu tượng là gì. Tôi không thể thấy sự khác biệt được đặt cược ở đó.

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