webForumDet fria alternativet

Tipstråd. Static, protected mm.

27 svar · 784 visningar · startad av Ekström

EkströmMedlem sedan feb. 20022 594 inlägg
#1

Tjenare,

Skulle vara bra med en tråd där ni lite mer kunniga tipsade oss mindre skickliga om vanliga fel, hur man undviker de. Lite tips och annat fint.

Jag skulle t.ex. vilja veta vad static och protected är bra för.

renholmMedlem sedan apr. 20012 266 inlägg
#2

static används för funktioner som inte behöver en instans, dvs att du kan använda den direkt genom object.funktion om det är en vanlig public så måste man först skapa en instans av objectet genom object mittO = new object sedan använda object.funktion.
Protected används för objekt som bara ska vara åtkomliga av objekt som ärvt från klassen den ligger i.

kristofferMedlem sedan juni 20001 257 inlägg
#3

Funktion? Metod heter det. Eller?

PMedlem sedan jan. 20012 204 inlägg
#4

metod = java

PaceMedlem sedan juni 20019 024 inlägg
#5

Det är väl så att det heter funktion i klassen (Function funktionen), men på objektet heter det metod (Objekt.Metod).

EkströmMedlem sedan feb. 20022 594 inlägg
#6

renholm: Tack! Bra förklarat.

Är det inte så att det heter metod, men i VB så är funktionerna metoder.

Override då, vad gör det?

NETworkMedlem sedan juni 20011 732 inlägg
#7

> Är det inte så att det heter metod, men i VB så är funktionerna metoder.

Ett exempel på en metod är ToString() som du kan köra på ett objekt (exempelvis en int) som då konverterar objektet till en sträng. En funktion är en funktion, men blir en metod om du använder den som en sådan. Tror jag. :)

Att overrida något innebär att du ersätter en metod med något annat. Exempelvis kanske du vill göra beräkningar för en oval, som ju har mycket gemensamt med en cirkel. Om du då har en klass för cirkelberäkningar så kan du ärva från den klassen och använda dig av alla de metoder dessa har gemensamt samtidigt som du overridar (ersätter, kör över) de metoder som är unika för cirkeln med metoder som är unika för din oval.

ZyaxMedlem sedan mars 200262 inlägg
#8

En metod körs på en klass precis som ovan nämnt. Funktioner är ju interna block som kan kallas på, alltså en privat metod ungefär...

override använder man när man överladdar en abstrakt eller virtuell metod.

Alltså när en klass B ärver från en klass A där A har en metod (eller något liknande) M som är abstrakt eller virtuell då kan klassen B överladda (override) metoden M så att metoden M körs i klassen B när objektet är av den typen.

Krångligt??

ZyaxMedlem sedan mars 200262 inlägg
#9

För förklarande av abstrakt och virtuell:
En abstrakt klass är en klass som inte kan instansieras.
En abstrakt metod MÅSTE överladdas av den som ärver.
En virtuell metod KAN överladdas.
En icke abstrakt, icke virtuell metod KAN INTE överladdas.

developerMedlem sedan aug. 2001458 inlägg
#10

Zyax skrev:

override använder man när man överladdar en abstrakt eller virtuell metod.

Alltså när en klass B ärver från en klass A där A har en metod (eller något liknande) M som är abstrakt eller virtuell då kan klassen B överladda (override) metoden M så att metoden M körs i klassen B när objektet är av den typen.

Override ("överskugga") och overload ("överlagra") är inte samma sak.

Overload är när man har flera metoder med samma och som tar olika argument. Till exempel är metoderna Bar nedan överlagrade:

class Foo {
    public void Bar(String s) { ... }
    public void Bar(Int32 i) { ... }
}

Override är när man i en subklass implementerar en metod med samma signatur (namn och parametrar) som en befintlig metod i basklassen.

ZyaxMedlem sedan mars 200262 inlägg
#11

Förlåt. Det är helt riktigt. Tänkte rätt men skrev fel

:o

GrynetMedlem sedan maj 2001329 inlägg
#12

En icke abstrakt, icke virtuell metod KAN INTE överladdas.

Korrekt men där emot kan den gömmas (hide) med en new modiefiern.

public class Class : BaseClass{
...
public new void Method(){}
...
}

Men då tas den ur virtual mekanismen. Vilken är att man alltid kallar på motden till vilken typ metoden tillhör oavsett vilken typ den är nu (snygge förklaring).

NETworkMedlem sedan juni 20011 732 inlägg
#13

Stackars Ekström, han ville ha nybörjartips. ;) Vi har precis haft en diskussion om vad en funktion är med tanke på den här tråden och det verkar inte finnas något entydigt svar. En funktion är ju en kodmassa som gör något. En metod är alltså en funktion, men en funktion behöver inte vara en metod. Metoder är väl något som egentligen bara förekommer i den objektorienterade världen. I exempelvis pascall har du ju funktioner och procedurer där skillnaden är att procedurer inte returnerar något. I c# (och i c-världen) har du ju void-funktioner som egentligen betyder att den inte returnerar något, men det är inte riktigt sant för även en void-funktion kan returnera värden. vb.net har subs som ju egentligen bara är ett annat namn för funktion.

Ja, en funktion är helt enkelt bara ett samlingsnamn för en kodmassa som gör en massa goja och jag tror inte det finns någon exakt definition vad en funktion är och vad den måste innehålla. Rätta mig gärna om jag har fel...

fredrikMedlem sedan dec. 19991 072 inlägg
#14

"Static" i VB.NET = "Shared"

Själv har jag lärt mig att en "metod" är kod som arbetar med data. En metod kan returnera ett värde (=Funktion) eller bara utföra kod (Procedur).

fredrikMedlem sedan dec. 19991 072 inlägg
#15

Shadows

"Shadows" används för att ersätta en befintlig metod eller egenskap med något annat i en nedärvd klass.

"Overrides" kan bara skriva över metoder medans "Shadows" kan skriva över både metoder och egenskaper.

Ex:

public class frmClient
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ob As New bClass()
        Dim oD As New dClass()
        MessageBox.Show(ob.Value.ToString) ´10
        MessageBox.Show(oD.Value.ToString) ´"Från nedärvd klass"
        MessageBox.Show(oD.BaseValue.ToString) ´10
    End Sub
End Class

Public Class bClass
    Public Function Value() As Integer
        Return 10
    End Function
End Class

Public Class dClass
    Inherits bClass

    Public Shadows Value As String = "Från nedärvd klass"

    Public Function BaseValue() As String
        Return MyBase.Value
    End Function

End Class

I exmplet visas hur en nedärvd klass kan skriva över en metod i bas-klassen med en egenskap.

Klienten som vanligtvis bara instansierar den nedärvda klassen får dess värde från en egenskap. OM klienten däremot instansierar direkt från basklassen kommer värdet från en funktion.

Den nedärvda klassen kan däremot komma åt basklassens implementering genom att ange "mybase".

GrynetMedlem sedan maj 2001329 inlägg
#16

För att fortsätta lite tips grejer så hittade jag en bra reglel angående arv. Kommer ifrån Bob Hathaways Comp.Object Faq (hittar tyvärr ingen länk till dokumentet, skulle ha varit http://www.geodesic.com/people/bob)

Där i hänvisar han till LALonde (90) att ett arv ska kunna genomgå ett så kallat is-a-kind-of eller is-a test.

Alltså en människa är ett djur. (klassen människa arver från djur)

Eller cirkel är en figur.

etc..

Arv kan också ske vid differntial programming vad det nu är?

ZyaxMedlem sedan mars 200262 inlägg
#17

Late binding and Polymorphism

It is quite common in object-oriented systems to code multiple classes of an object that respond to the same messages.
The ability of different objects to respond differently to the
same message is known as polymorphism. This approach is clearly superior to using a huge case statement for all the known graphical data types in a single global draw procedure.
Polymorphism is partly responsible for a well-known characteristic of object-oriented systems, a style of programming sometimes referred to as differential programming or programming by modifications.

GrynetMedlem sedan maj 2001329 inlägg
#18

ah, det du beskriver måste vara C# interfaces, eller?

ptypeMedlem sedan juni 2002151 inlägg
#19

Funktion? Metod heter det. Eller?

metod = java

Jag tror det heter metod allmänt i objektorienterad, och funktion i vanliga funktionsorienterade språk.

fredrikMedlem sedan dec. 19991 072 inlägg
#20

Det tre "Huvud"-blocken i OO (Objekts-Orientering) är "PIE" - "Polymorfism" - "Inheritance" - "Encapsulation".

Polymorfism (som tidigare förklarat) - "Gränssnitts-arv", dvs att man ärver bara gränssnittet (metoder, händelser och Egenskaper) och inte koden i dessa. Detta kan implementeras på 2 olika sätt:

  • Genom att först deklarera ett Gränssnitt och sedan implementera detta:

    Public Interface IClass
    Sub Start()
    Property Name() as string
    End Interface
    
    Public Class ClassLogic
    Implements IClass
    
    Public sub Start() Implements IClass.Start
    
    end sub
    
    Public property Name() as string Implements IClass.Name
    Get
    
    End Get
    Set(ByVal Value As String)
    
    End Set
    End Class
    
  • Genom att använda arv.

    Public MustInherit Class Class1
        Public MustOverride Sub Start()
        Public MustOverride Property Name() As String
    End Class
    
    Public Class classLogic
        Inherits Class1
    
        Public Overrides Sub Start()
    
        End Sub
        Public Overrides Property Name() As String
            Get
    
            End Get
            Set(ByVal Value As String)
    
            End Set
        End Property
    
    End Class
    

Mycket användbart för att strukturera klasser och implementera logik som tex. "IEnumerable" som enkelt låter dig använa "For...Each"-logik.

Inheritance - arv, dvs att du ärver både gränssnitt och logik från en basklass. Detta kan styras med diverse nyckelord som tillåter dig att antingen skriva över ärvda metoder eller inte.

Encapsulation - Inkapsling av kod, dvs att du skyddar din data och ex. bara gör den "Readonly".

Public Class classLogic
    Private m_strName As String

    Private Sub myPrivateMethod()
        ´Här kan tex. läggas kod för att förändra privata variabler
        m_strName = "Fredrik"
    End Sub

    Public ReadOnly Property strName() As String
        Get
            Return m_strName
        End Get
    End Property
End Class

Klassen kan då endast själv förändra själva datat, medan klienten bara kan hämta ut värdet utan att förändra det.

136 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)