12. august 2003 - 11:04Der 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. :)
Virksomheder er på vej fra store sprogmodeller, der svarer på spørgsmål, til AI-agenter, der kan udføre opgaver på egen hånd. Det gør teknologien mere nyttig – og langt mere risikabel.
<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); } }
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
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]...
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å.
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?
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å.
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.
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]); } }
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..
Jamen det har jeg også allerede gjort. Det bliver rigtig fint det hele nu.
Synes godt om
Ny brugerNybegynder
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.