Hej! Om man skapar en metod i en klass så skickar man ju normalt in eventuella variabler i parentesen som parametrar (klass.minmetod(variabel)). Men hur gör man en metod av den här typen:
variabel.MinMetod();
...där "variabel" bearbetas i klassen? Och är det någon praktisk skillnad mellan dessa två?
Det du är ute efter måste ju vara klass-variabler? Eller instans-variabler?
class MyClass {
static int MyClassVariable = 0;
int MyInstanceVariable = 0;
...
}
Skillnaden är att den statiska variabeln är inte beroende av att det finns en instans av klassen, medan MyInstanceVariable kommer du endast åt genom att först skapa en instans av MyClass.
"Praktiskt skillnad": För det första, en variabel (av en typ, t.ex. int, bool) kan du inte skapa metoder till - om det inte är en instans av t.ex. String-klassen. Då får du bygga wrapper-klasser runt String för att utöka med egen funktionalitet. För det andra, klassvariabler används när du inte behöver/inte ska skapa en instans av någon klass. T.ex. för properties och konstanta värden.
Det du är ute efter måste ju vara klass-variabler? Eller instans-variabler?
Nja, tror inte det...? Alltså, om metoden .ToUpper() inte fanns och jag skulle göra en egen så skulle jag göra en statisk metod i min klass och den skulle jag ju då anropa så här:
string s = "hejpådig";
MyLabel.Text = MinKlass.ToUpper(s);
Men nu finns ju redan metoden och för att använda den skriver man ju så här:
string s = "hejpådig";
MyLabel.Text = s.ToUpper();
Du kan bara göra .ToUpper() på ett objekt av din klass där metoden finns. orsaken till att toString() alltid finns, för alla instanser är för att den finns i klassen object som alla klasser ärver ifrån.
så om du vill kunna göra en .toUpper() på en string så måste du först ärva String till en egen klass som kan heta MyString, där du lägger metoden .toUpper(), då kan du göra det som du föreslår.
Detta är ett exempel som jag är osäker på om det funkar så nån annan får gärna kopiera och rätta till det, jag inbillar mig att man kanske behöver nån inner class eller nåt?
public class MyString extends String
{
import System.Text.StringTokenizer;
public MyString toUpper()
{
//logik för att kolla om varje bokstav är liten, och isf göra den stor.
return myStringInstanceContainingBigString;
}
}
//...I en annan klass:
MyString s = "Gör Allt StorT";
s.toUpper();
Asså jag har en princip för detta i huvudet, men jag tror inte exemplet riktigt stämmer
Du kan alltså bara anropa metoden enligt ditt exempel om du anropar den på ett objekt av klassen där metoden finns.
Uh, jag tror jag förstår lite granna fast itne så mycket... :) Men hur ärver jag String, det är ju ingen egen klass, eller? Och om den finns i klassen object som alla klasser ärver från så borde ju min egen klass redan ha det arvet?
Tänkte göra en metod ".FirstLetterUp()" som gör första bokstaven till versal och resten gemener. Men skulle gärna anropa den på samma sätt som .ToUpper() ...
Finns det någon annan praktisk skillnad mellan de olika sätten eller är det bara syntaxen som skiljer dem åt i slutändan?
Red: Såg att du hade slängt med lite kod nu, ska genast testa! :)
String är visst en egen klass (beroende på programspråk givetvis) men den är lite speciell. du behöver göra en polymorf-grej här tror jag.
jag tänker mig detta:
Mystring s = new String();
Jag har inte full koll dock.
asså det som finns i object är metoden "toString()" som gör ett objekt till en sträng.
Vilket språk programmerar du i?
kom på att min kod var java.. bara så du vet.. det kan bli så ibland ^^
Ok, det handlade om klass-metoder och instans-metoder. ;)
Man lägger den som en instans-metod för att ToUpper() endast ska användas på sträng-objekt. Du kan ju t.ex. inte göra en int till upper-case. Fördelaktigt för att, dels vara logiskt och dels för att minska risken för att programmeraren skickar in något annat än en sträng som parameter till metoden.
Ok, det handlade om klass-metoder och instans-metoder. ;)
Man lägger den som en instans-metod för att ToUpper() endast ska användas på sträng-objekt. Du kan ju t.ex. inte göra en int till upper-case. Fördelaktigt för att, dels vara logiskt och dels för att minska risken för att programmeraren skickar in något annat än en sträng som parameter till metoden.
Aha, ja det förstås! Då borde ju min egen metod ".FirstLetterUp()" byggas just som en instansmetod på klassen string... ska man bara klura ut hur då. :)
Om du enbart ska ha funktionaliteten att göra första bokstaven stor, är det lite overhead att bygga ut med wrapper-klassen.
jo, iofs men jag har ytterligare ett antal metoder som jag skulle vilja implementera på klassen string. Antar att alla dessa metoder kan dela på en wrapperklass (heter det så)? Sen är det intressant att lära sig hur man gör också... :)
c# men det är ju ganska lika så det förstår jag... men jag lyckas inte skapa ett arv till klassen string.
String-klassen är sealed (= går inte att ärva), av säkerhets- och prestandaskäl. Det går att lägga till nya metoder även på sealed-klasser i C# 3.0 med extension methods om man är lagd åt det hållet, däremot.
Jag kom på att i .net 3.0 så finns det en funktion som heter Extension Metodhs som skall göra så du kan skriva dina egna metoder till olika objekt, typ så här:
int i = 10 ;
i.SpankMonkey() ; // Spanks the monkey per the logic you wrote.