2010-11-05 31 views

Trả lời

9

Tôi giả sử bạn có thể tạo hàm tạo của lớp internal để chỉ các lớp khác trong assembly có thể lấy được từ chúng, nếu bạn vẫn cần tạo các thể hiện của lớp đó, bạn có thể cung cấp phương thức factory để trả về các cá thể.

chỉnh sửa để thêm một mẫu:

public class MyFoo 
{ 
    internal MyFoo() 
    { 
    } 

    public static MyFoo CreateFoo() 
    { 
     return new MyFoo(); 
    } 
} 
+0

Làm mát tuyệt vời. Cảm ơn! –

5

Eric Lippert nhấn mạnh ba cách để làm điều này. tl; dr: không niêm phong lớp của bạn, nhưng bao gồm một phương thức trừu tượng nội bộ trong lớp của bạn, hoặc làm cho tất cả các nhà xây dựng nội bộ hoặc riêng tư, hoặc sử dụng thuộc tính PermissionSet để thêm siêu dữ liệu vào lớp.

http://blogs.msdn.com/b/ericlippert/archive/2008/09/26/preventing-third-party-derivation-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx

0

Bạn cũng có thể thử làm một cái gì đó như thế này.

internal class InternalExtendible 
{ 
    public string MyProperty { get; set; } 
} 

public sealed class ExternalSealedClass : InternalExtendible 
{ 
} 

Tạo lớp nội bộ và tạo lớp trống công khai kế thừa từ lớp nội bộ. Khi tham chiếu dll, chỉ có lớp công khai sẽ được hiển thị cho người dùng, nhưng tất cả các chức năng của lớp bên trong sẽ được hiển thị.

+1

Xảy ra cho tôi, nhưng vấn đề lớn là nếu có phương pháp tiếp cận công cộng tiêu thụ hoặc trả lại loại này - chữ ký là gì? Nếu bạn sử dụng 'ExternalSealedClass', những người kế thừa" thực sự "của bạn sẽ không đủ điều kiện. Nếu bạn sử dụng 'InternalExtensible', phương thức của bạn không thể công khai được nữa. – mquander

+0

@mquander Bạn không thể làm được điều đó bằng cách lập trình cho một giao diện? tức là chữ ký của bạn sẽ trông giống như "void DoSomething (IExtendableOrSealed item) {...}" – Michael

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