Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Method to "override" shared Members in child classes

Tags:

vb.net

At the moment I'm trying to create a kind of model in vb.net which can be used to create/fetch database entrys.

I created a main class Model with a shared function to fetch the datasets, e.g. Model.find(). Now I'd like to create Classes which inherit the main Model-Class, e.g. a separate one for users: UserModel.find() => "SELECT * FROM users".

What I need now is to find a way to tell the Class which table it should use. I thought about an abstract String "table" which is a constant in each "child-model", but how could this be implemented as it's not possible to override shared members?

Thanks in advance!

Edit: Maybe this will make it a little clearer what I mean:

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

So I want a shared method which finds all database entries and gives back an array of instances of its own type, e.g. Model(). That's why I wanted to keep the find-method shared and not bound to an instance.

like image 772
stex Avatar asked Mar 05 '10 12:03

stex


1 Answers

I think you could use Generics. Here I´ve pasted an example

All the classes in your domain could inherit from Entity class

Public MustInherit Class Entity

    '...

End Class

Your Model class, with your method Find

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

One class of your domain, for example: User class

Public Class User
    Inherits Entity

    ' ...

End Class

And finally, an example of how could you instantiate the Find method

Model.Find(Of User)()

'...

I dunno if this is what you mean, do you find this helpfull?

like image 189
Javier Avatar answered Oct 08 '22 17:10

Javier