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.
27 svar · 784 visningar · startad av Ekström
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.
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.
Funktion? Metod heter det. Eller?
metod = java
Det är väl så att det heter funktion i klassen (Function funktionen), men på objektet heter det metod (Objekt.Metod).
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?
> Ä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.
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??
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.
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.
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).
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...
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".
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?
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.
ah, det du beskriver måste vara C# interfaces, eller?
Funktion? Metod heter det. Eller?
metod = java
Jag tror det heter metod allmänt i objektorienterad, och funktion i vanliga funktionsorienterade språk.
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.