2008-10-28 18 views
7

निम्नलिखित कोड पर विचार करें:बाल उदाहरण कॉल आधार वर्ग विधि से कि ओवरराइड की गई थी

Public Class Animal 

Public Overridable Function Speak() As String 
    Return "Hello" 
End Function 

End Class 

Public Class Dog 
    Inherits Animal 

    Public Overrides Function Speak() As String 
     Return "Ruff" 
    End Function 

End Class 

Dim dog As New Dog 
Dim animal As Animal 
animal = CType(dog, Animal) 
// Want "Hello", getting "Ruff" 
animal.Speak() 

मैं कैसे/पशु को कुत्ते के कहने CTYPE और कहा जाता हो Animal.Speak है परिवर्तित कर सकते हैं?

उत्तर

10

आप नहीं करते; उप-वर्ग की विधि विरासत की परिभाषा के अनुसार सुपरक्लास की विधि को ओवरराइड करती है।

यदि आप ओवरराइड विधि उपलब्ध होना चाहते हैं, तो इसे उपclass में प्रकट करें, उदा।

Public Class Dog 
    Inherits Animal 
    Public Overrides Function Speak() As String 
     Return "Ruff" 
    End Function 
    Public Function SpeakAsAnimal() As String 
     Return MyBase.Speak() 
    End Function 
End Class 
0

मुझे नहीं लगता कि आप कर सकते हैं।

बात यह है कि वस्तु अभी भी एक कुत्ता है। जिस व्यवहार का आप वर्णन कर रहे हैं ("हेलो" की बजाय जाली वस्तु से "रफ" प्राप्त करना) मानक है क्योंकि आप विभिन्न प्रकार के जानवरों के समूह को बोलने के लिए पशु वर्ग का उपयोग करने में सक्षम होना चाहते हैं।

उदाहरण के लिए, यदि आप किसी तृतीय वर्ग के रूप में इस प्रकार था: आपको क्या मूल रूप से करने के बारे में बात कर रहे हैं

protected sub Something 
    Dim oCat as New Cat 
    Dim oDog as New Dog 

    MakeSpeak(oCat) 
    MakeSpeak(oDog) 
End sub 

protected sub MakeSpeak(ani as animal) 
    Console.WriteLine(ani.Speak()) 
end sub 

:

Public Class Cat 
    Inherits Animal 

    Public Overrides Function Speak() As String 
     Return "Meow" 
    End Function 
End Class 

तो फिर तुम इस प्रकार की तरह उन तक पहुंच सकेंगे होगा विरासत श्रृंखला तोड़ता है। अब, सेट करके यह किया जा सकता है फ़ंक्शन को स्वीकार करने के लिए एक पैरामीटर स्वीकार करने के लिए कहें जो इसे मूल मान वापस करने के लिए कहता है या नहीं, या मूल मूल्य के लिए एक अलग SPEAK फ़ंक्शन, लेकिन बॉक्स से बाहर, आप नहीं जा रहे हैं इस तरह से व्यवहार करने वाली चीजें पाने के लिए।

+0

"एक अन्य विकल्प, एक जानवर के रूप में वस्तु का ऐलान करते हैं और फिर एक कुत्ते को डाली जब आप कुत्ते के विस्तारित गुण की जरूरत है । " वह अंतिम भाग सच नहीं है। वैरिएबल का घोषित प्रकार व्यर्थ है जब यह दिया जाता है कि एक दिया गया उदाहरण polymorphically कैसे व्यवहार करता है। –

+0

यह सच है, मैं इंटरफेस के मामले में सोच रहा था। –

1

मैं पूछूंगा कि आप इस प्रकार के व्यवहार को पाने का प्रयास क्यों कर रहे हैं। ऐसा लगता है कि एक विधि के माता-पिता वर्ग के कार्यान्वयन को लागू करने के लिए आपको एक संकेत है कि आपके पास सिस्टम में कहीं और डिज़ाइन दोष है।

हालांकि, अन्य लोगों ने कहा है कि माता-पिता वर्ग के कार्यान्वयन को आपके वर्गों की संरचना के तरीके के बारे में बताए जाने का कोई तरीका नहीं है। अब कुत्ते वर्ग के भीतर आप

MyBase.Speak() 

जो आह्वान हैं माता-पिता वर्ग 'कार्यान्वयन कह सकते हैं, लेकिन कुत्ता वर्ग के बाहर से यह करने के लिए कोई तरीका नहीं है।

1

मुझे लगता है कि अगर आप "अतिरंजित" ड्रॉप करते हैं और "ओवरराइड" को "नया" में बदलते हैं तो आप जो चाहते हैं उसे प्राप्त करेंगे।

Public Class Animal 

Public Function Speak() As String 
    Return "Hello" 
End Function 

End Class 

Public Class Dog 
    Inherits Animal 

    Public New Function Speak() As String 
     Return "Ruff" 
    End Function 

End Class 

Dim dog As New Dog 
Dim animal As Animal 
dog.Speak() ' should be "Ruff" 
animal = CType(dog, Animal) 
animal.Speak() ' should be "Hello" 
+2

नया कीवर्ड यह है कि आप इसे सी # में कैसे करेंगे। वीबी में बराबर छाया है। आमतौर पर छाया का उपयोग करना एक बुरा विचार है। यह एक खराब ऑब्जेक्ट ओरिएंटेड डिजाइन अभ्यास है। यह लिस्कोव प्रतिस्थापन सिद्धांत का उल्लंघन है। –

0

मुझे पता है कि यह कुछ महीने पहले पोस्ट किया गया है, लेकिन मैं अभी भी पूर्णता के लिए प्रयास करने और उत्तर देने जा रहा हूं।

आपको बताया गया है कि आप सेdog कक्षा में ओवरड्रिएन विधि तक पहुंच सकते हैं, और फिर आप इसे एक अलग नाम से बेनकाब कर सकते हैं। लेकिन एक सशर्त उपयोग करने के बारे में क्या?

तुम सिर्फ कर सकते हैं:

Public Class Animal 

Public Overridable Function Speak(Optional ByVal speakNormal as Boolean = False) As String 
    Return "Hello" 
End Function 

End Class 

Public Class Dog 
    Inherits Animal 

    Public Overrides Function Speak(Optional ByVal speakNormal as Boolean = False) As String 
     If speakNormal then 
      return MyBase.Speak() 
     Else 
      Return "Ruff" 
     End If 
    End Function 

End Class 

और फिर उन्हें पसंद फोन:

Dim dog As New Dog 
Dim animal As new Animal 
animal.Speak() //"Hello" 
dog.Speak()//"Ruff" 
dog.Speak(true)//"Hello" 

वैकल्पिक रूप से, आप getTheAnimalInTheDog और कर सकते हैं यहSpeak():

तुम सिर्फ कर सकते हैं:

Public Class Animal 

Public Overridable Function Speak() As String 
    Return "Hello" 
End Function 

Public MustOverride Function GetTheAnimalInMe() As Animal 

End Class 

Public Class Dog 
    Inherits Animal 

    Public Overrides Function Speak() As String 
     Return "Ruff" 
    End Function 

    Public Overrides Function GetTheAnimalInMe() As Animal 
     Dim a As New Animal 
     //Load a with the necessary custom parameters (if any) 
     Return a 
    End Function 
End Class 

और फिर फिर से:

Dim dog As New Dog 
Dim animal As new Animal 
animal.Speak() //"Hello" 
dog.Speak()//"Ruff" 
dog.GetTheAnimalInMe().Speak()//"Hello" 

आशा है कि यह मदद करता है;)

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