Překrytí metod   zodpovězená otázka

VB.NET, Architektura

Dobrý den,

pokud mám třídu dědící např. z Dictionary(Of string, object)

A chtěl bych "zamaskovat, zprivátnit" metody předka lze toho nějak docílit ?


public class MojeTrida
   inherits Dictionary(of string, object)

'zneviditelná původní metoda
'nejde ovšem zapsat takto, ale jen jako shadow
'to je ovšem vidět zvenčí
private Sub Remove(key as string)
   mybase.remove(key)
end sub

'nová metoda se stejnou funkčností
public sub RemoveObject( name as string)
   'krok 1
   'krok 2
   'krok n

   Me.Remove(name)
end sub

chtěl bych, aby zvenčí nebyla vidět metoda z dictionary Remove, ale pouze moje metoda RemoveObject.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Nejde to. Můžete použít Shadows a metodu pojmenovat Remove, ale je potřeba dobře si uvědomit, jaké to bude mít důsledky při polymorfním použití. Příklad:

Class Test
  Overridable Function GetText() As String
    Return "Zavolána původní metoda."
  End Function
End Class

Class Test2
  Inherits Test
  Overrides Function GetText() As String
    Return "Zavolána Overrides metoda."
  End Function
End Class

Class Test3
  Inherits Test
  Shadows Function GetText() As String
    Return "Zavolána Shadows metoda."
  End Function
End Class

Dim t As New Test
Console.WriteLine(t.GetText())

Dim t2 As New Test2
Console.WriteLine(t2.GetText())

Dim t3 As New Test3
Console.WriteLine(t3.GetText())

'Tady to začíná být zajímavé - do t4 a t5 lze narvat cokoliv
'kompatibilního s Test. Důležité je, co se pak ve skutečnosti
'zavolá.

Dim t4 As Test = New Test2
Console.WriteLine(t4.GetText())

Dim t5 As Test = New Test3
Console.WriteLine(t5.GetText())

Chvíli si s tím hrajte a pochopíte, jaké to má důsledky. Mě to kdysi dávno také chvilku trvalo pochopit.

Druhá možnost je implementovat rozhraní IDictionary(Of TKey, TValue), jenže potom budete muset ručně udělat funkčnost kolekce.

Je vidět, že se pomaloučku dostáváte do tajů OOP, protože já jsem na začátku řešil uplně stejné věci.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Lepší je dávat přednost skládání před dědičností, tj. vytvořit si kolekci typu slovník jako privátní vlastnost třídy, která bude iniciována v konstruktoru.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Děkuji už jsem na to přišel také.


public class mojeTrida
   implements idictionary(of string, object)

   private _dct as new dictionary(of string, object)

   public sub RemoveObject(name as string) implements ... Remove()
      'něco
      _dct.remove(name)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Lepší to rozhodně není, protože potom ztrácíte možnost polymorfního použití třídy.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Mohl by jste mi upřesnit v čem je ta nevýhoda ztráty polymorfního chování třídy ?

(Třída implementuje IDictionary, jehož metody využívají metody privátního Dictionary)

Navenek je i moje třída Dictionary (resp. IDictionary) nebo je nevýhoda někde jinde ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Implementovat vlastní kolekci s použitím Private kolekce bylo zcela zbytečné, je to práce navíc a mohl jste použít již hotové a otestované řešení. Pokud to alespoň implementuje IDictionary, s polymorfizmem problém nebude.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback