2010-03-05 40 views
6

Hiện tại tôi đang cố tạo một loại mô hình trong vb.net có thể được sử dụng để tạo/tìm nạp các mục nhập cơ sở dữ liệu.Phương pháp "ghi đè" các Thành viên được chia sẻ trong các lớp con

Tôi đã tạo Mô hình lớp chính với chức năng được chia sẻ để tìm nạp các tập dữ liệu, ví dụ: Model.find(). Bây giờ tôi muốn tạo Lớp học kế thừa Lớp mô hình chính, ví dụ: một riêng biệt cho người dùng: UserModel.find() => "SELECT * FROM users".

Điều tôi cần bây giờ là tìm cách cho Lớp biết nên sử dụng bảng nào. Tôi nghĩ về một chuỗi "bảng" trừu tượng là một hằng số trong mỗi "mô hình con", nhưng làm thế nào điều này có thể được thực hiện vì nó không thể ghi đè lên các thành viên được chia sẻ?

Cảm ơn trước!

Sửa: Có lẽ điều này sẽ làm cho nó rõ ràng hơn một chút những gì tôi có nghĩa là:

Public Class Model 
Public Shared _controller As Controller 

Public Shared table As String 
Protected Shared tableFields As String() 
Shared reader As Npgsql.NpgsqlDataReader 

Public Shared Function find() 
    Dim a As ArrayList = New ArrayList 

    'Test if the tablefields are already known to the class, if not, get them 

    If tableFields Is Nothing Then 
     getTableFields() 
    End If 

    Dim query As String = "SELECT " + String.Join(", ", tableFields) + " FROM " + table 
    reader = _controller.executeReader(query) 
     While reader.Read 
      o = New Model 
      Dim v As New Hashtable 
      For Each field In tableFields 
       v(field) = reader(field) 
      Next 
      o.values = v 
      a.Add(o) 
     End While 
     reader.Close() 
     Return DirectCast(a.ToArray(GetType(Model)), Model()) 
End Function 

Public values As Hashtable 

Public Sub New() 
End Sub 

End Class 

Vì vậy, tôi muốn có một phương pháp chia sẻ mà tìm tất cả các mục cơ sở dữ liệu và phản hồi lại một loạt các trường hợp của kiểu riêng của mình, ví dụ Mô hình(). Đó là lý do tại sao tôi muốn giữ cho phương pháp tìm được chia sẻ và không bị ràng buộc với một cá thể.

Trả lời

4

Tôi nghĩ bạn có thể sử dụng Generics.Ở đây Tôi đã dán một ví dụ

Tất cả các lớp học trong miền của bạn có thể kế thừa từ lớp Entity

Public MustInherit Class Entity 

    '... 

End Class 

bạn lớp Mẫu, với phương pháp của bạn Tìm

Public Class Model 

    Public Shared Sub Find(Of T As Entity)() 

     ' You could know the name of T to find the table 

     Dim tableName As String = GetType(T).Name 

     '... 

    End Sub 

End Class 

Một lớp trong miền của bạn, ví dụ: Lớp người dùng

Public Class User 
    Inherits Entity 

    ' ... 

End Class 

Và cuối cùng, một ví dụ về cách có thể giúp bạn nhanh chóng Find phương pháp

Model.Find(Of User)() 

'... 

I dunno nếu điều này là những gì bạn có nghĩa là, để bạn tìm thấy hữu ích này?

0

Bạn có thể làm cho lớp trừu tượng chính của mình và mỗi lớp con sẽ phải trả lại tên bảng "riêng" thông qua triển khai của chính nó (ví dụ: getTableName). Bằng cách này, bạn sẽ chỉ phải duy trì logic của bạn trong lớp chính.

0

Người ta thường sử dụng mẫu thiết kế Singleton trong các trường hợp như vậy: tạo một phương thức thể hiện, ghi đè bằng các lớp kế thừa. Mỗi lớp kế thừa nên có phương thức đó trả về một đối tượng Singleton liên quan đến lớp đó.

Dưới đây là một cách để làm việc đó:

MustInherit Class BaseClass 
    Public MustOverride Function getTableName() As String 
End Class 

Class Class1 
    Inherits BaseClass 
    Private Shared TableName As String = "myTable1" 
    Public Overrides Function getTableName() As String 
     Return TableName 
    End Function 
End Class 

Class Class2 
    Inherits BaseClass 
    Private Shared TableName As String = "myTable2" 
    Public Overrides Function getTableName() As String 
     Return TableName 
    End Function 
End Class 

EDIT: một cách tiếp cận hoàn toàn khác. Bạn có thể có các lớp cơ sở giữ một số từ điển, trong đó có liên quan loại lớp (hoặc gõ tên) với bảng đúng:

Class BaseClass 
    Private Shared myDictionary As New Collections.Generic.Dictionary(Of Type, String) 
    Friend Shared Sub RegisterType(ByVal childType As Type, ByVal tableName As String) 
     myDictionary.Add(childType, tableName) 
    End Sub 
    Public Shared Function getTableName(ByVal childType As Type) As String 
     Return myDictionary.Item(childType) 
    End Function 
End Class 
Class Class1 
    Shared Sub New() 
     BaseClass.RegisterType(GetType(Class1), "table1") 
    End Sub 
End Class 
Class Class2 
    Shared Sub New() 
     BaseClass.RegisterType(GetType(Class2), "table2") 
    End Sub 
End Class 
+0

Đó là những gì tôi đã thử trước đây, vấn đề là, tôi cần tên bảng trong phương thức được chia sẻ và không thể khai báo chức năng được chia sẻ công khai là ghi đè/ghi đè. Hay tôi đã hiểu sai mã của bạn? – stex

+0

Hàm getTableName không được chia sẻ - nó là phương thức thể hiện "bình thường", phải được ghi đè bởi các lớp con. Mỗi lớp con ghi đè phương thức này trả về một biến chia sẻ riêng (hoặc một hằng số cấp lớp, nếu có thể). Mọi trường hợp của Class1 sẽ trả về cùng một TableName, mặc dù thực tế là getTableName là một phương thức thể hiện chứ không phải phương thức chia sẻ. Ý tưởng là làm cho một phương thức instance hoạt động như một phương thức chia sẻ khi được kích hoạt (trả về cùng một giá trị/tham chiếu, bất kể phương thức của instance nào được gọi), trong khi vẫn giữ các lợi ích của việc ghi đè trong các lớp con. –

+0

Vâng, tôi hiểu. Nhưng tôi không muốn tạo một thể hiện của Class1, tôi muốn Class1 biết về tên bảng mà không cần tạo một đối tượng. – stex

0

Shared (tĩnh) các đối tượng hoặc các thành viên đối tượng không thể được thừa hưởng hoặc overrided. Thừa kế là ví dụ của một đối tượng. Vì bạn không phải khởi tạo một lớp tĩnh, bạn không thể kế thừa từ nó. Cùng với các phương pháp. Một phương thức tĩnh không được ảo (có thể ghi đè trong VB) vì nó định nghĩa một phương thức thực hiện các nhiệm vụ không có cá thể của lớp. Sau đó, điều này làm cho nó không thể sử dụng các trường instance hoặc các thuộc tính trong một phương thức tĩnh (Shared in VB). Đây là một thiết kế xấu đang cố gắng như vậy.

Thực tế, mọi lớp tĩnh (Được chia sẻ) phải được đánh dấu là Không thể nhận dạng trong VB và chỉ định hàm khởi tạo trống mặc định. Đây là một sự rò rỉ từ VB liên quan đến các khái niệm OOP.

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