Por el momento, intento crear un tipo de modelo en vb.net que se pueda usar para crear/obtener bases de datos de entrys.Método para "anular" miembros compartidos en clases secundarias
Creé un modelo de clase principal con una función compartida para buscar los conjuntos de datos, p. Model.find(). Ahora me gustaría crear clases que hereden la clase modelo principal, p. Ej. una separada para los usuarios: UserModel.find() => "SELECT * FROM users".
Lo que necesito ahora es encontrar una manera de decirle a la clase qué tabla debe usar. Pensé en una "tabla" de cadenas abstracta que es una constante en cada "modelo hijo", pero ¿cómo podría implementarse esto ya que no es posible anular los miembros compartidos?
¡Gracias de antemano!
Editar: Tal vez esto hará que sea un poco más claro lo que quiero decir:
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
Así que quiero un método compartido que encuentra todas las entradas de base de datos y devuelve una serie de ejemplos de su propio tipo, p.ej Modelo(). Es por eso que quería mantener el método find compartido y no vinculado a una instancia.
Eso es lo que probé antes, el problema es que necesito el nombre de la tabla en el método compartido y no puedo declarar una función compartida pública como overridable/mustoverride. ¿O no entendí tu código? – stex
La función getTableName no se comparte; es un método de instancia "normal", que debe ser reemplazado por subclases. Cada subclase que anula este método devuelve una variable privada compartida (o una constante a nivel de clase, si es posible). Cada instancia de Class1 devolverá el mismo TableName, a pesar de que getTableName es un método de instancia y no un método compartido. La idea es hacer que un método de instancia actúe como un método compartido cuando se desencadena (devuelve el mismo valor/referencia, sin importar el método de la instancia que se invoque), manteniendo los beneficios de la anulación en subclases. –
Sí, lo entiendo. Pero no quiero crear una instancia de Class1, quiero que Class1 sepa sobre el nombre de la tabla sin crear un objeto. – stex