webForumDet fria alternativet

Hur gör man en egen metod typ .ToUpper()?

.NET

15 svar · 801 visningar · startad av butiko

Medlem sedan jan. 2007152 inlägg
Frågan#1

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å?

Medlem sedan mars 20007 896 inlägg
#2

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.

Medlem sedan jan. 2007152 inlägg
#3

SPiN skrev:

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();

Är alltså nyfiken på hur man gör och varför!

Medlem sedan juli 200799 inlägg
#4

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.

Tror jag...enlighten me if i'm wrong :bire

Medlem sedan jan. 2007152 inlägg
#5

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! :)

Medlem sedan juli 200799 inlägg
#6

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 ^^

Medlem sedan mars 20007 896 inlägg
#7

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.

Medlem sedan jan. 2007152 inlägg
#8

c# men det är ju ganska lika så det förstår jag... men jag lyckas inte skapa ett arv till klassen string.

Medlem sedan jan. 2007152 inlägg
#9

SPiN skrev:

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å. :)

Medlem sedan mars 20007 896 inlägg
#10

Om du enbart ska ha funktionaliteten att göra första bokstaven stor, är det lite overhead att bygga ut med wrapper-klassen.

Medlem sedan jan. 2007152 inlägg
#11

SPiN skrev:

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å... :)

Medlem sedan juli 200799 inlägg
Medlem sedan jan. 2007152 inlägg
#13

Det där var helt klart överkurs för mig, jag tror nog jag får använda den gamla hederliga metoden istället...

Medlem sedan juni 20008 205 inlägg
#14

butiko skrev:

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.

Medlem sedan maj 20012 812 inlägg
#15

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.

Där du själv skriver SpankMonkey() metoden helt separat från int klassen. Du kan läsa lite mer på denna blog: http://blah.winsmarts.com/2006/05/18/demystifying-c-30--part-3-extension-methods.aspx

- M

Medlem sedan feb. 2005280 inlägg
#16

Det känns som det ekar härinne?? :bire

271 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)