2012-06-22 17 views
5

Tôi đã đọc qua các bài viết theo SOnguồn gốc lớp gọi phương thức tĩnh của lớp cơ sở trong phương pháp tĩnh của riêng mình

Tất cả dường như rất gần câu hỏi của tôi và có câu trả lời hay, nhưng dường như họ không trả lời câu hỏi của tôi ngoài việc nói rằng tôi cần phải làm cho phương thức không tĩnh.

một ví dụ:

abstract public class baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property1","property2"}); 
    // code for property definition and access 
    virtual public static bool ValidAttribtue(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
      return true; 
     else 
      return false; 
    } 
} 
class derivedA : baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property3","property4"}); 
    // code for property definition and access 
    public static override bool ValidAttribute(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
     { 
      return true; 
     } 
     else 
     { 
      return base.ValidAttribute(attributeName); 
     } 
    } 
} 
class derivedB : baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property10","property11"}); 
    // code for property definition and access 
    public static override bool ValidAttribute(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
     { 
      return true; 
     } 
     else 
     { 
      return base.ValidAttribute(attributeName); 
     } 
    } 
} 

derivedA sẽ có các tính chất 1,2,3,4 trong khi derivedB sẽ có đặc tính 1,2,10,11. Danh sách các thuộc tính có vẻ là một giá trị cụ thể của lớp và không thể thay đổi tại bất kỳ thời điểm nào. Tôi nghĩ nó sẽ tĩnh.

Thiết kế của tôi sai theo nghĩa là tôi đang cố gắng sử dụng các phương pháp tĩnh khi chúng không được?

Ví dụ trên làm cho tôi nghĩ rằng kế thừa các phương pháp tĩnh là cần thiết, nhưng có vẻ như cố gắng làm điều này là một lỗi thiết kế. Bất cứ ai có thể giúp tôi hiểu những gì là sai với mã hóa hoặc cấu trúc các lớp học theo cách này?

+0

là mã thực tế này? Bạn không thể có các thành viên tĩnh ảo. –

+0

Không, nó chỉ là mã ví dụ về một hoạt động mà tôi đã nghĩ là có thể. –

Trả lời

8

Thiết kế của tôi sai theo nghĩa là tôi đang cố gắng sử dụng các phương pháp tĩnh khi chúng không được?

Có. Ngoài bất cứ điều gì khác, bạn đang cố gắng khai báo một phương thức tĩnh là virtual (và sau đó ghi đè lên nó), điều này không được phép. Bạn cũng đang cố gắng khai báo một lớp có tên là base, khi đó là từ khóa.

Phương pháp tĩnh đơn giản là không đa hình. Cơ sở của đa hình là kiểu thời gian thực hiện của cá thể có liên quan có thể khác với kiểu thời gian biên dịch của biểu thức, và việc thực hiện được chọn trên cơ sở kiểu thời gian thực hiện. Khái niệm đó không có ý nghĩa đối với các phương pháp tĩnh vì có không có trường hợp nào.

Bây giờ tất nhiên bạn có thể tạo phương thức tĩnh trong lớp dẫn xuất gọi phương thức tĩnh trong lớp cơ sở - nhưng sẽ không có bất kỳ đa hình nào ở bất kỳ đâu.

Là một mặt lưu ý, tất cả các phương pháp của bạn có thể được viết theo một cách dễ đọc hơn:

// Base class implementation 
return attributeNames.Contains(attributeName); 

// Derived class implementations 
return attributeNames.Contains(attributeName) || 
     BaseClass.ValidAttribute(attributeName); 
+0

Để đảm bảo rằng tôi hiểu chính xác điều này, lớp trừu tượng định nghĩa hoạt động mà tất cả các lớp dẫn xuất sẽ có. Các lớp dẫn xuất cần có chức năng ở đó. Việc kiểm tra không thay đổi bao giờ và hoàn toàn được xác định tại thời gian biên dịch. Sự hiện diện hoặc vắng mặt của một tài sản được biết đến tại thời gian biên dịch. Việc kiểm tra cần phải thay đổi cho mỗi lớp nhưng sẽ có thể tận dụng lợi thế của hàm lớp cơ sở. Tòa nhà này trên nhau không phải là một cơ chế tĩnh mà thay vào đó là một cơ chế đa hình? –

+0

@JohnGroman: Nếu bạn không * cần * đa hình - tức làkêu gọi thực hiện "đúng" tại thời điểm thực hiện dựa trên loại cá thể - sau đó bạn có thể làm điều này mà không có đa hình. Tôi sẽ khuyên bạn nên cung cấp cho các phương thức các tên khác nhau để làm cho nó rõ ràng hơn rằng có * không * bất kỳ sự đa hình nào đang diễn ra, nhưng nó sẽ hoạt động, theo phương thức tĩnh của lớp dẫn xuất gọi phương thức tĩnh của lớp cơ sở. Nó chỉ là một phương pháp tĩnh, như xa như ngôn ngữ có liên quan - không có mối quan hệ giữa hai. –

+0

Cảm ơn câu trả lời và nhận xét Tôi đoán tôi cần đọc thêm về đa hình. Cũng cảm ơn cho các hình thức dễ đọc hơn –