Avatar billede eskeeske Nybegynder
12. august 2003 - 11:04 Der er 15 kommentarer og
1 løsning

Statisk Index Property

Kære C# Kategori

Jeg har en klasse som hedder 'Kunde'. I denne klasse har jeg en statisk metode som hedder

Kunde.getKundeByID(int id)

Hvordan kan jeg lave det om så at jeg blot kan skrive

Kunde[id]

Mvh.

p.s. Lad nu være med at skrive alt muligt sludder med at det er dårlig kode, og at jeg f.eks. ikke må bruge danske navne, fordi det er jo blot et eksempel ikke. :)
Avatar billede bennytordrup Nybegynder
12. august 2003 - 11:12 #1
I din klasse tilføjer du dette:

<Snip>
  public int this [int index]  // Indexer declaration
  {
      get
      {
        // Check the index limits.
        if (index < 0 || index >= 100) // Tilpas til dine grænser
            return 0;
        else
            return Kunde.getKundeById(index);
      }
      set
      {
        if (!(index < 0 || index >= 100))  // Tilpas til dine grænser
            Kunde.setKundeById(index, value);
      }
  }
Avatar billede quaser Nybegynder
12. august 2003 - 11:13 #2
Ikke muligt at lave

    static public Kunde this[int Index]
    {   
      get
      {
        // The appropriate item is retrieved from the List object and   
        // explicitly cast to the Leaf type, then returned to the     
        // caller.   
        return new Kunde();
      }
    } 

Returnere følgende:
The modifier 'static' is not valid for this item
Avatar billede quaser Nybegynder
12. august 2003 - 11:17 #3
Hmm benny, hvordan vil du returnere en Kunde object, som int?
Avatar billede bennytordrup Nybegynder
12. august 2003 - 11:19 #4
quaser>> Convert.ToInt32 :-)

Det var en typo.

public kunde this[int Index]...

Desuden skal du ikke angive static foran public. static fortæller, at du ikke behøver at oprette en instans af klassen for at bruge metoden. Den skal bare hedde public Kunde this[int Index]...
Avatar billede eskeeske Nybegynder
12. august 2003 - 11:27 #5
Jeg kigger på det, men det skal jo være en indexer på den statiske klasse, ikke på en instans af klasen. Jeg synes det du laver ligner en indexer på en instans af Kunde, er det ikke det det er.

Kan det andet ikke lade sig gøre. Det virker ikke for mig bare at skrive static, iøvrigt ville det jo også være lidt noget fis det med 'this' så.
Avatar billede quaser Nybegynder
12. august 2003 - 11:35 #6
Benny >>
hvis din metode skal bruges skal det gøres sådan her:

Kunde k = new Kunde();
Kunde denkundejegvilhave = k[2];

Hvilket ikke var det der blev efterlyst.

eskeeske >>
Du kan evt. lave en collection over dine Kunder og så hente dem via.
Kunde k = kundeCollection[2];
Men ved ikke lige om det er det du ønsker?
Avatar billede eskeeske Nybegynder
12. august 2003 - 11:46 #7
Nej, jeg ønsker det kun hvis det er let. Fordi ellers kan jeg jo bare bruge den der getKundeByID().

Men det kan måske ikke lade sig gøre, jeg vender tilbage i tråden hvis jeg finder ud af noget.

Jeg tænker pludselig på at det jo også kan laves en construktor. Så ledes at man kan skrive Kunde k = new Kunde(2), det er nok den rigtige måde at gøre det på.

VH
Avatar billede quaser Nybegynder
12. august 2003 - 11:54 #8
Det er også en mulighed.

Ved at bruge getKundeByID() vil du dog kunne lave lidt mere.

F.eks. kunne der tjekkes på om kunde objectet var gemt i cachen, og så kunne man nøjes med at hente den derfra istedet for at oprette den fra databasen.
Avatar billede arne_v Ekspert
12. august 2003 - 13:42 #9
Jeg tror at der er et problem i den objekt orienterede modellering.

Det giver ikke meget mening at have en klasse som indeholder
en statisk liste af elementer af sin egen type.

Grundliggende er Kunde og KundeListe to forskellige klasser.

Jeg prøvede lige at lave lidt kode til at illustrere:

Customer.cs:

class Customer
{
    private int no;
    private string name;
    public Customer(int no, string name)
    {
        this.no = no;
        this.name = name;
    }
    public int No {
        get
        {
            return no;
        }
    }
    public string Name {
        get
        {
            return name;
        }
    }
    public override string ToString()
    {
        return (no + " " + name);
    }
}

CustomerList.cs:

using System.Collections;

class CustomerList
{
    private Hashtable list;
    public CustomerList()
    {
        list = new Hashtable();
    }
    public void Add(Customer c)
    {
        list.Add(c.No, c);
    }
    public Customer Get(int no)
    {
        return (Customer)list[no];
    }
    public Customer this[int no]
    {
        get
        {
            return (Customer)list[no];
        }
    }
}

Main.cs:

using System;

class MainClass
{
    public static void Main(string[] args)
    {
        Customer c1 = new Customer(1, "Kunde 1");
        Console.WriteLine(c1.No + " " + c1.Name);
        Console.WriteLine(c1);
        CustomerList clist = new CustomerList();
        clist.Add(c1);
        Customer c2 = new Customer(2, "Kunde 2");
        clist.Add(c2);
        Console.WriteLine(clist.Get(2));
        Console.WriteLine(clist[2]);
    }
}
Avatar billede quaser Nybegynder
12. august 2003 - 14:06 #10
Prøv at uddybe hvad problemet er?

Følgende metode er vidt udbredt, blandt andet også i selve .Net frameworket.

    public Kundethis[int Index]
    {   
    get{
      if(Count > Index)
        return (Kunde)List[Index];
      else
        return null;
        }
    } 

Hvor man f.eks. kan hente de enkelte fields ud fra en SqlDataReader ved at kalde.
string id = myReader[0];
string name = myReader[1];
Avatar billede eskeeske Nybegynder
12. august 2003 - 15:33 #11
Nå men jeg har altså min kundeListe indbygget i min Kunde, undskyld.....

Iøvrigt er det slet ikke Kunder men noget helt helt andet....

Slut herfra.
Avatar billede arne_v Ekspert
12. august 2003 - 15:49 #12
Det er ligegyldigt om det er kunder eller noget andet.

Men du får et bedre program ved at adskille objektet fra
listen af objekter.
Avatar billede eskeeske Nybegynder
12. august 2003 - 15:53 #13
Du har ret
Avatar billede eskeeske Nybegynder
15. august 2003 - 12:17 #14
arne_v:

Altså når jeg skrev at du havde ret mente jeg det fagtisk.

I mit system er der 10 klasser som kunde hvor Klasse Og Collection var i samme fil/klasse. Men nu er jeg ved at skille dem ad, således at de alle for en Collection og Således at der kun er ikke-statiske metoder.

Så hvis du har andre kloge ideer arne_v så er det nu du skal komme med dem..
Avatar billede arne_v Ekspert
15. august 2003 - 12:21 #15
Jeg ved ikke om jeg har så mange kloge ideer.

Jeg er selv totalt begynder i C#.

Men har en solid baggrund i C++ og Java.

Det eneste jeg lige kunne tænke på er at hvis en bestemt liste
kun kan findes i en instans per definition, så kunne du lave den
som singleton.
Avatar billede eskeeske Nybegynder
15. august 2003 - 14:22 #16
Jamen det har jeg også allerede gjort.
Det bliver rigtig fint det hele nu.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester