2010-03-05 13 views
6

फिलहाल मैं vb.net जो डेटाबेस entrys बनाने/लाने के लिए इस्तेमाल किया जा सकता में मॉडल का एक प्रकार बनाने के लिए कोशिश कर रहा हूँ "ओवरराइड" करने के लिए।विधि बच्चे कक्षाओं में साझा सदस्य

मैं एक साझा समारोह के साथ एक मुख्य वर्ग मॉडल बनाया डेटासेट लाने के लिए, उदाहरण के लिए Model.find()। अब मैं कक्षाएं बनाना चाहता हूं जो मुख्य मॉडल-कक्षा का उत्तराधिकारी है, उदा। उपयोगकर्ताओं के लिए एक अलग: UserModel.find() => "उपयोगकर्ताओं से चुनें"।

मुझे अब जो चाहिए वह कक्षा को बताने का एक तरीका ढूंढना है जिसकी तालिका का उपयोग करना चाहिए। मैंने एक अमूर्त स्ट्रिंग "टेबल" के बारे में सोचा जो कि प्रत्येक "बाल-मॉडल" में स्थिर है, लेकिन यह कैसे लागू किया जा सकता है क्योंकि साझा सदस्यों को ओवरराइड करना संभव नहीं है?

अग्रिम धन्यवाद!

संपादित: शायद यह यह थोड़ा स्पष्ट मैं क्या मतलब है कर देगा:

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 

इसलिए मैं चाहता हूँ जो सभी डेटाबेस प्रविष्टियों पाता है और वापस अपने स्वयं के प्रकार के उदाहरण की एक सरणी देता है एक साझा विधि, जैसे आदर्श()। यही कारण है कि मैं खोज-विधि साझा करना चाहता था और एक उदाहरण से बंधे नहीं था।

उत्तर

4

मैं तुम्हें Generics इस्तेमाल कर सकते हैं लगता है।यहाँ मैं एक उदाहरण

सभी अपने डोमेन की कक्षाओं इकाई वर्ग से विरासत सकता चिपकाया

Public MustInherit Class Entity 

    '... 

End Class 

आपका मॉडल वर्ग, अपने विधि के साथ खोजें

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 

एक वर्ग आपके डोमेन का, उदाहरण के लिए: उपयोगकर्ता वर्ग

Public Class User 
    Inherits Entity 

    ' ... 

End Class 

और अंत में, का एक उदाहरण है कि कैसे आप ढूँढें विधि

Model.Find(Of User)() 

'... 

मुझे पता नहीं है कि अगर यह तुम क्या मतलब है, तो आप इस उपयोगी पाते हैं दृष्टांत सकता है?

0

आप अपना मुख्य वर्ग सार बना सकते हैं और प्रत्येक उप-वर्ग को अपने स्वयं के कार्यान्वयन (उदा। getTableName) के माध्यम से अपना "स्वयं" तालिका नाम वापस करना होगा। इस तरह, आपको केवल मुख्य कक्षा में विधि तर्क बनाए रखना होगा। एक उदाहरण विधि, कक्षाएं इनहेरिट द्वारा ओवरराइड बनाने के लिए:

0

यह ऐसे मामलों में सिंगलटन डिजाइन पैटर्न का उपयोग करने के लिए आम बात है। प्रत्येक विरासत वर्ग में उस उदाहरण विधि से उस वर्ग से संबंधित सिंगलटन ऑब्जेक्ट को वापस करना चाहिए।

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 

संपादित करें: एक पूरी अलग दृष्टिकोण

यहाँ यह ऐसा करने का एक तरीका है। आप आधार वर्ग सही तालिका के साथ कुछ शब्दकोश है, जो वर्ग प्रकार संबंधित है पकड़ (या नाम लिखें) हो सकता है:

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

यही मैंने पहले किया था, समस्या यह है कि मुझे साझा विधि में तालिका का नाम चाहिए और सार्वजनिक साझा फ़ंक्शन को अतिसंवेदनशील/mustoverride के रूप में घोषित नहीं किया जा सकता है। या मैंने आपके कोड को गलत समझा? – stex

+0

GetTableName फ़ंक्शन साझा नहीं किया जाता है - यह एक "सामान्य" उदाहरण विधि है, जिसे उप-वर्गों द्वारा ओवरराइड किया जाना चाहिए। प्रत्येक उप-वर्ग जो इस विधि को ओवरराइड करता है, एक निजी साझा चर (या यदि संभव हो तो कक्षा-स्तर स्थिरांक) देता है। कक्षा 1 का प्रत्येक उदाहरण उसी तालिका नाम को वापस कर देगा, इस तथ्य के बावजूद कि getableName एक उदाहरण विधि है और साझा विधि नहीं है। विचार यह है कि उप-वर्गों में ओवरराइडिंग के लाभों को ध्यान में रखते हुए, ट्रिगर होने पर साझा विधि के रूप में एक इंस्टेंस विधि कार्य करना (समान मूल्य/संदर्भ लौटाएं, चाहे कोई भी उदाहरण विधि लागू न हो)। –

+0

हाँ, मैं समझता हूं। लेकिन मैं कक्षा 1 का उदाहरण नहीं बनाना चाहता हूं, मैं कक्षा 1 को किसी ऑब्जेक्ट के निर्माण के बिना टेबल नाम के बारे में जानना चाहता हूं। – stex

0

साझा (स्थिर) वस्तुओं या वस्तु के सदस्यों विरासत में मिला नहीं किया जा सकता या overrided। विरासत किसी वस्तु के उदाहरण के लिए है। चूंकि आपको स्थिर वर्ग को तुरंत चालू करने की आवश्यकता नहीं है, इसलिए आप इससे प्राप्त नहीं कर सकते हैं। विधियों के साथ ही वही। एक स्थिर विधि वर्चुअल नहीं होनी चाहिए (वीबी में अतिरंजित) क्योंकि यह उस विधि को परिभाषित करता है जो वर्ग के किसी उदाहरण के साथ कार्य करता है। फिर यह एक स्थिर (वीबी में साझा) विधि के भीतर उदाहरण फ़ील्ड या गुणों का उपयोग करना असंभव बनाता है। यह एक बुरा डिजाइन ऐसा करने की कोशिश कर रहा है।

वास्तव में, हर स्थिर (साझा) कक्षाओं VB में NotInheritable के रूप में चिह्नित किया जाना चाहिए, और केवल डिफ़ॉल्ट खाली निर्माता को परिभाषित। ओओपी अवधारणाओं के संबंध में यह वीबी से एक रिसाव है।

संबंधित मुद्दे