Gå til innhold

Anbefalte innlegg

Prøver å effektivisere klassene mine litte grann her, fordi jeg har et sett med klasser som alle sammen har nøyaktig samme virkemåte, men med forskjellig datatype. Jeg tenker at generiske klasser og metoder må være en slags løsning her, men klarer ikke helt å få dette til

 

Sett att man har disse klassene:

public class kunder
{
 // Div properties
 public KundeClass GetKunde(string pKundeID)
 {
// Kode som henter rett kunde o returnere et objekt
 }
}

public class varer
{
 // Div Properties
 public VareClass GetVare(string pVareID)
 {
// Kode som henter rett vare
 }
}

som dere ser så er dette nesten identisk. Forskjellen ligger i at metodene håndterer forskjelige datatyper.

 

Jeg ønsker å lage en klasse som ser noe slik ut:

public class datafil
{
 // Eventuelle properties
 public EttEllerAnnet GetRecord(string pRecordID)
 {
// En eller annen form for generisk kode
 }
}

og dermed kunen gjøre slik:

datafil  Kunder = new datafil(MuligensNoeHer)

evt.

class Kunder : datafil
{

}

 

Jeg har svert liten erfaring med generiske klasser, annet en at jeg ser hvordan det virker. Jobber mye med List<t> og SortedList<k,v> etc. så jeg kjenner prinsippene i den enkleste formen.

 

Takker for all hjelp med dette..

 

Ole

Endret av HDSoftware
Lenke til kommentar
Videoannonse
Annonse

50 stykker har lest denne tråden og ingen vet hvordan?

Betyr dette at det ikke lar seg gjøre?

Kansje litt ambisiøs her ;-)

 

I Clarion ville jeg løst dette ved å lage en template (Clarions måte å lage generisk kode). Kansje jeg kan lage en template i Visual Studio som fikser dette?

 

Anyone....?!?

 

Ole

Lenke til kommentar

public class DataFile<T> where T : IData, new()
{
 public T Get(string id)
 {
 T s = new T();
 FileStream fs = File.OpenRead(s.Filename);
 s.Populate(id);
 return s;
 }
}

public class Kunde : IData
{
 public string Filename
 {
 get { return "filename"; }
 }

 public void Populate(string id)
 {
 }
}

public class Vare : IData
{
 public string Filename
 {
get { return "filename"; }
 }

 public void Populate(string id)
 {
 }
}

public interface IData
{
  string Filename{get;}
  void Populate(string id);
}

 

Absolutt ikke noe fullstending løsning, men gir deg muligens noe å bygge videre på. Bare for å illustrere hvordan du kan bruke properties/funksjoner på IData i den generiske Get metoden. For å bruke den:

 

DataFile<Kunde> fKunde = new DataFile<Kunde>();

Kunde kunde = fKunde.Get("1");

DataFile<Vare> fVare = new DataFile<Vare>();

Vare vare = fVare.Get("1");

Endret av The Jackal
Lenke til kommentar

For å gjøre det litt lettere for deg (muligens), så betyr "where" at du kan sette restriksjoner på genericen (T i dette tilfellet). Her har jeg sagt at denne klassen må være av type IData og new() betyr at det må finnes en parameterløs konstruktør (som jeg forsåvidt ikke har definert, men siden det ikke finnes noen andre konstruktører der så er den der implisitt).

 

Edit: mer om contraints hvis det interesserer: http://msdn.microsoft.com/en-us/library/d5x73970.aspx

Endret av The Jackal
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...