2009-09-20 19 views
6

Ngay bây giờ tôi có một lớp cơ sở cho các trang kế thừa System.Web.UI.Page và một lớp cơ sở khác cho các liên kết người dùng kế thừa System.Web.UI.UserControl, các lớp này chứa cùng phương pháp. Vì C# không hỗ trợ đa kế thừa nên tôi không thể kết hợp hai lớp thành một thừa hưởng cả Trang và UserControl.Lớp cơ sở chung cho các liên kết người dùng và các trang trong ASP.NET

Cách nào tốt nhất để giữ chức năng trong hai lớp cơ sở nhưng chỉ thực hiện các phương pháp này ở một nơi?

Tôi đang nghĩ đến việc tạo một giao diện và để cho hai lớp cơ sở gọi một lớp thứ ba có chứa việc triển khai giao diện. Có cách nào tốt hơn để khi tôi thêm một phương pháp mới tôi không phải làm điều đó ở ba nơi (mặc dù việc thực hiện chỉ trong lớp thứ ba).

+0

Có bất cứ lý do bạn không chỉ tạo ra một lớp helper mà chấp nhận một HttpContext trong các nhà xây dựng? Điều này sẽ cho bạn khả năng làm những việc như nhìn vào chuỗi truy vấn và thực hiện Response.Redirects. – nizmow

+0

Câu hỏi ban đầu là về httpContext, đó là về mã tùy chỉnh trong các lớp cơ sở trang (một trường hợp sử dụng phổ biến) là DRY giữa các trang và các điều khiển của người dùng. Nó khá có khả năng các phương pháp được đề cập là cụ thể cho logic nghiệp vụ và không có gì để làm với bối cảnh http. –

Trả lời

9

Nếu bạn đang sử dụng C# 3.0, bạn có thể cung cấp phương pháp helper của bạn như là phương pháp mở rộng cho lớp System.Web.UI.Control, trong đó cả hai System.Web.UI.PageSystem.Web.UI.UserControl lớp lấy được.

public static class ControlExtensions { 
    public static void DoSomething(this Control obj) { 
     // do something 
    } 
} 

Trong Page hoặc UserControl:

this.DoSomething(); 
+0

Câu trả lời tuyệt vời @Mehrdad! – ProfK

1

Hmm ... có vẻ như việc sử dụng các lớp Helper nổi tiếng, về cơ bản các lớp học như

public static class StringHelper 
{ 

    public static string Replace(...) 
    { 
     ... 
    } 

} 

và gọi họ như

string x = StringHelper.Replace(...); 

Mặc dù tôi thường khá lo ngại về việc có quá nhiều người trợ giúp này bởi vì họ thực sự nhớ lập trình thủ tục với các phương pháp tĩnh trong chúng. Ở phía bên kia, các chức năng như bạn mô tả nó (trong một số lớp cơ sở mở rộng UserControl và Page) thường thuộc loại này.

Những gì tôi thường làm sau đó là có một StringHelper và một StringExtender tương ứng mà bên trong logic gọi các phương thức tĩnh của lớp Helper. Bằng cách này, bạn có thể sử dụng chức năng với các phương thức mở rộng C# mới hoặc trực tiếp thông qua lớp tĩnh như bình thường.

3

Tôi có cùng một vấn đề. Đây là giải pháp của tôi.

tôi định nghĩa giao diện trống

public interface ISecurableWebObject 
    { 
    } 

Sau đó, tôi định nghĩa lớp đó có phương pháp extesion cho giao diện trên

public static class ISecurableWebObjectExtender 
    { 
     public static bool ExtensionMetotX(this ISecurableWebObject obj) 
     { 
      return ...; 
     } 
    } 

Tôi thừa hưởng ISecurableWebObject trong lớp Page và WebUserControl định nghĩa rất dublicate đã biến mất.

public partial class UcExample : System.Web.UI.UserControl, ISecurableWebObject 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if(this.ExtensionMetotX() == true) 
      { ... } 
     } 
    } 
Các vấn đề liên quan