Class MyCollection   otázka

VB.NET

Dobrý den,

jak bych si mohl odvodit třídu MyCollection od třídy Collection?

Rád bych tam dodal nějaké procedury.

Dim store as new MyCollection

store.myProcedure()

tak něco takového.

To samé bych chtěl udělat s polem a také s typem string.

Trošku tuším že je to kravina a že se to dělá jinak ale nemůžu nikde najít správný způsob.

Díky,

PetrS

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

Nejlepší budou extension methods.

Imports System.Runtime.CompilerServices ' nebo tak nějak se ten namespace jmenuje, vs vám to případně poradí
Module Extensions
<Extension()> _
Public Sub MyProcedure(ByVal c As Collection, ByVal p As Integer)
    MsgBox("What am I supposed to do with Collection and Integer?")
End Sub
End Module

První parametr (c) udává, k jakému typu se extenzní metoda váže. V kódu normálně použijete:

Dim c As Collection
c.MyProcedure(7)

Extenzní metoda bude oznčena nějakým modrým nesmyslem v intellisense, myslím, že šipkou směřující dolů.

Jo, a extenzní metody musí být vždy umístěny v modulu. Je jedno jak jej pojmenujete, ale musí to tak být. Taky se dají použít myslím jen procedury a funkci, vlastnosti a podobně už ne. Tedy aspoň myslím, kouknu se na to.

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

Tady trošku něco k tomu:

http://www.aspnet.cz/Articles/177-extens...

Ve VB .NET není potřeba používat this. Kompilátor pozná, že je o extenzní metodu podle atributu Extension. Typ, který metoda rozšiřuje je vždy první parametr. Jak napsal pan Valášek, extension methods byli implementovány hlavně kvůli LINQ. Jsou výborným pomocníkem pro udržení hezkého kódu bez zbytečného dědění kvůli jedné metodě navíc. A k tomu, dají se rozšiřovat i třídy, které nejsou děditelné. Takže třeba třída System.Drawing.Graphics. Na ní to s oblibou používám já. Příjemný den.

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

Dobrý den,

pro 2.0 fw to bude asi jiné. Ale děkuji za tip. Aspoň už vím co mám hledat.

PetrS

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

V .NET Frameworku 2.0 tohleto bohužel nejde.

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

Hodnotové typy dědit nelze, takže jediné řešení je Extension Methods. Collection lze dědit normálním způsobem:

Class MyCollection
  Inherits Collection
  Public Sub MyMethod()
    'Vlastní metoda
  End Sub
End Class
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

dělal jsem nějaké úpravy v nastavení projektu tak aby nepoužíval některé knihovny. Aby projekt nebyl moc velký. Je možné, že toto způsobuje zprávu:

MyCollection cannot inherit from class collection because collection is declared NotInheritable.

Pro všechny .NET knihovny mám verzi 2.

Díky Petr

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

To znamená, že třída, ze které chcete dědit má dáno, že z ní dědit nelze. Nezbývá, než vytvořit na takovou třídu wrapper(vytvořit třídu MyCollection a v ní držet referenci na vnitřní třídu Collection, deklarovat všechny její metody a funkce ve Vaší třídě, plus připsat Vámi požadovanou funkcionalitu). Možná existují i jednodušší řešení, ale já jinou cestu nevidím. Teď je ale otázka, jestli prostě nebude lepší napsat si do nějakého modulu nějakou statickou funkci a předávat jí kolekci jako parametr?

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

Ono by se hlavně nemělo dědit od Collection. Udělejte si novou třídu a implementujte v ní rozhraní Collection(Of vášTyp). Dovnitř si plácněte List(Of vášTyp) a naimplementujte metody z rozhraní ICollection tak, aby jen volaly to samé na Listu. A nezapomeňte si tam přidat ty svoje vlastní :-).

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

Dobrý den,

Tak tohle je pro mě španělská vesnice. Mohl by jste prosím uvézt nějaký kraťoučký příklad, nebo mě alespoň odkázat do patřičných míst? :)

Díky,

PetrS

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

"Aby projekt nebyl moc velký" Co je to za blbost? Knihovny .NET Frameworku které referencujete v projektu se nikam nepřilinkovávají a jsou umístěny v GAC. Jedině tak možná těch pár kB metadat, která nesou informaci o referencovaných knihovnách. Doporučoval bych vám, abyste podobně zhovadělé "optimalizace" nedělal, protože tím naděláte víc škody než užitku.

Pokud chcete nějakou třídu dědit, podívejte se nejdřív na její definici v Object Browseru nebo v MSDN. Pokud je třída označená jako NotInheritable (sealed), tak z ní nelze dědit.

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

Dobrý den,

tedy přeložit si, že NotInheritable znamená "nelze dědit", to dokážu. Dotaz zněl, zda je to tím, že používám Framework 2.0.

Bohužel nejsem odborník, a tak s tím vším tady pouze experimentuji. Tady přehodím tohle, támhle zjistím, že jde tohle, támhle zase, že mi to usnadní práci.

Asi jsem vysledoval, že používání jedné knihovny navíc jen kvůli dvoum řádkům v projektu, které můžu opsat jiným způsobem, je zbytečné. Navíc jsem si všiml, že mi to generuje nějakou pětimegovou knihovnu.

Také jsem zjistil, že na více počítačů je pouze Framework 2.0, a také jsem zjistil, že někteří lidé nejsou ochotní si instalovat něco dalšího.

Vyrobení tabulky, která zjistí verzi Frameworku v počítači jsem zatím odložil, zkrátka jsem se soustředil na něco jiného.

Doufám, že toto bude jako vysvětlení stačit. :)

Samozřejmě děkuji za připomínky,byť bez obalu, jsem zase o něco chytřejší.

PetrS

nahlásit spamnahlásit spam 0 odpovědětodpovědět
Public Class MyCollection
    Inherits CollectionBase

    Public Sub Add(ByVal item As String)
        MyBase.List.Add(item)
    End Sub

    Public Sub Remove(ByVal i As Integer)
        MyBase.List.RemoveAt(i)
    End Sub

    Default Public Property Item(ByVal i As Integer) As String
        Get
            Return CType(MyBase.List.Item(i), String)
        End Get
        Set(ByVal value As String)
            MyBase.List.Item(i) = value
        End Set
    End Property
    Public Function toArray()
        Dim toArr(MyBase.List.Count - 1) As String
        For Each Item As String In MyBase.List

        Next
        For i As Integer = 0 To MyBase.List.Count - 1
            toArr(i) = Item(i)
        Next
        Return toArr
    End Function

End Class

http://www.vbnet.cz/forum-tema--418-spec...

PetrS

nahlásit spamnahlásit spam 0 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