Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  12 1417
Hei

Hvordan lager man en klasse som man kan legge innhold rett inn i. For esksempel som klassen String.

Kode

String hei = "Knut";
Jannis
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Det er mulig jeg tar feil, men jeg tror faktisk ikke dette er mulig. Du har noe som heter "operator overloading" som lar deg bestemme oppførsel for mange operatorer som +, -, osv, men det virker ikke som om denne fungerer på =.

Et alternativ er jo å lage en konstruktormetode, dette er sannsynligvis det nærmeste du kommer.
Sist endret av robhol; 19. august 2010 kl. 16:47.
Nå har ikke jeg kodet særlig mye C# men kan man ikke bare gjøre String hei = new String("Knut"); ?
Sist endret av flexd; 19. august 2010 kl. 18:42.
Jeg er heller ikke en kløpper på C#, har jobbet mest med PHP, men det hadde gjerne blitt litt enklere hvis du hadde kommet med en eksempel på hva du skulle bruke denne klassen til?
nso
popålol
nso's Avatar
Administrator
Jeg tror du må forklare litt mer hva du ønsker.

Tenker du på deklarasjon av attributer i selve instansieringen?
Da blir det slik:

Kode

var test = new SomeClass() {
  Attributt1 = "kake",
  Attributt2 = "mann"
};
Eller tenker du kanskje mer på statiske klasser?
Sist endret av nso; 19. august 2010 kl. 18:48.
Det er som robhol sier, det er ikke mulig å overloade assignmentoperatoren i C#.

Ref: http://msdn.microsoft.com/en-us/libr...v=VS.100).aspx
er det ikke mulig å lage en konstruktør som i java?

da kan du parametere til et nytt objekt...
Jannis!'s Avatar
Trådstarter
Da regner jeg med at det ikke går.
Til dere som ikke skjønte hva jeg ville, kan jeg prøve å forklare en gang til.

Beskrivelse av hva jeg ønsker:
String er en klasse. Du kan lage en ny instans ved hjelp av new String();.
Men, du kan også skrive String MyObject = "Hei", og den lager automatisk en instans av klassen string med innholdet "Hei".

Jeg ønsker å få til det samme i en egendefinert klasse.
MyClass MyObject = "Hei";, så er det en metode som automatisk henter inn "Hei" og lagrer det i klassen.

Det går altså ikke.

Takk for hjelpen!
m0b
m0b's Avatar
DonorAdministrator
Til hvilket bruk skal dette benyttes? Hvis du forteller litt om hva du prøver å oppnå, så kanskje vi kan komme med en alternativ løsning?
Det går nok ikke nei - og jeg vil nå si at det nok ikke gjør noe heller. Sett at det var mulig, så gir

MyClass obj = "Hei";


..ikke akkurat noen særlig god oversikt over hva som skjer - er det muligens en property i obj vi ikke kjenner navnet på som blir satt til "Hei"? Det blir dessuten fryktelig tvetydig - hvis vi kan sette en deklarasjon av en MyClass-variabel til en string, blir det fort spørsmål om hva MyClass egentlig er? På den ene siden inneholder den kanskje en rekke medlemmer - på den andre siden er den tilsynelatende bare en string. Dette er nok grunnen til av overloading av '=' ikke er mulig.

Send heller informasjonen enten gjennom constructor, eller sett en tilhørende property til det i etterkant. Tvil om hva som skjer i en kodebit er sjelden bra.
Sist endret av aspis; 20. august 2010 kl. 19:45.
Sitat av Jannis! Vis innlegg
Men, du kan også skrive String MyObject = "Hei", og den lager automatisk en instans av klassen string med innholdet "Hei".
Vis hele sitatet...
Enig med de fleste her, dette gir ikke mening. Og la meg forsøke å forklare hvor du tar feil. Det er ikke = "Hei" som lager en ny string i MyObject. Det er "Hei" som oppretter en ny streng, punktum! Det nye objektet (strengen) assignes så til variabelen MyObject. Det gir derfor ingen mening å overstyre assignment som noen nevnte, da assignment har kun én betydning i C# - en veldig konkret én. Og den er ikke knyttet til string eller noen annen datatype.

Det er altså "XXX" som er "konstruktøren" her. Det du kanskje kunne ønsket deg da var for eksempel å kunne instansiere regulære uttrykk med å skrive ting som /[A-Z]*/ (slik du kan i Ruby m.fl.), eller %290376-12345% for å opprette en nytt personnummer-instans osv. Og nei, det går heller ikke - da snakker vi i så fall utvidelser av selve språket.
▼ ... mange måneder senere ... ▼
Jannis!'s Avatar
Trådstarter
Hei igjen.

Vet at denne tråden er svært gammel, men jeg ville bare fortelle om at jeg endelig fant ut av det... egentlig ganske på slump.

Det jeg så etter var implicit operator.

Kode

class MimeType {
  public static implicit operator MimeType(string mime){
    return new MimeType(mime);
  }
}
som gjør det mulig å skrive

Kode

MimeType image = "image/jpeg";
eller

Kode

var images = GetByType("image/jpeg");
//var images = GetByType(MimeType.JpegImage);
m0b
m0b's Avatar
DonorAdministrator
Oi, akkurat det der var en liten snedig bit informasjon som faktisk har gått meg litt hus forbi, og er svært interessant i en rekke scenario "from the top of my head", takker!

Men, jeg tror muligens vi også kunne løst problemet med et factory-pattern? Uten at det nødvendigvis trenger være en sinnssykt god løsning.
Sist endret av m0b; 15. mars 2011 kl. 03:04.