OOP (C#): Hur får jag detta att fungera?

Permalänk
Medlem

OOP (C#): Hur får jag detta att fungera?

Hej!

Jag håller på att programmera ett program som ska fungera som ett slags lagerprogram för produkter. Vet inte riktigt hur jag ska få det att fungera.

Programmet är uppbyggt ungefär på detta sätt. Innehållandes följande klasser:

Produktmanager - Innehåller fält "produktlista"(Lista med instanser av Produkt)

Produkt - Innehåller fälten "sak"(En instans av Sak) och "idnummer"(int). Här finns även en konstruktor som innehåller raderna : sak = new Fotboll(); och idnummer = 1;.

Sak - Innehåller fälten "namn"(sträng) och "pris"(int)

Fotboll - Ärver Sak och innehåller fält "färg"(sträng)

I klassen Produktmanager finns en metod som lägger till en ny produkt i listan.

Problemet är att när det finns en Fotboll i listan så kommer man inte åt fältet färg. Man kommer bara åt fälten som finns i klassen Sak.

Ska inte fältet "sak" i klassen produkt kunna innehålla instanser av subklassen "Fotboll"? Tänker jag fel här? Om det går att göra så hur gör jag för att komma åt fälten som ligger i subklassen fotboll?

Tacksam för svar.

Permalänk
Medlem
Skrivet av Plala:

Produkt - Innehåller fälten "sak"(En instans av Sak) och "idnummer"(int). Här finns även en konstruktor som innehåller raderna : sak = new Fotboll(); och idnummer = 1;.

Jag antar (hoppas) att detta bara är temporärt. Konstruktorn borde ta "saken" som argument. ID-numret borde genereras unikt av konstruktorn om det är unikt per Produkt-instans, eller tas som argument om alla produkter av en viss typ har samma ID.

Skrivet av Plala:

Sak - Innehåller fälten "namn"(sträng) och "pris"(int)

Fotboll - Ärver Sak och innehåller fält "färg"(sträng)

I klassen Produktmanager finns en metod som lägger till en ny produkt i listan.

Problemet är att när det finns en Fotboll i listan så kommer man inte åt fältet färg. Man kommer bara åt fälten som finns i klassen Sak.

Ska inte fältet "sak" i klassen produkt kunna innehålla instanser av subklassen "Fotboll"? Tänker jag fel här? Om det går att göra så hur gör jag för att komma åt fälten som ligger i subklassen fotboll?

Det stämmer att sak kan "innehålla" (referera till) en Fotboll. Problemet är att saks datatyp fortfarande är Sak. Du kan bara komma åt det som är publikt i Sak; inte det som är specifikt för en undertyp. Givet din nuvarande design är enklaste lösningen på problemet troligtvis att casta till Fotboll när du behöver färgen:

((Fotboll) sak).färg = "blå";

Men du borde tänka om designen lite. Förslaget ovan blir väldigt omständigt när du har mer än en typ av "sak". Du måste hålla reda på vilken typ en viss sak är av, och agera därefter via en lång och troligtvis komplicerad kedja av if eller switch/case.

Det man brukar göra, och det du borde fundera över om det går i ditt fall, är att flytta upp egenskaper och "beteenden" så högt i arvskedjan som möjligt. Alltså flytta dem till första delen i kedjan där de är relevanta. Som exempel borde du flytta upp färg-egenskapen till Sak ifall alla saker har en färg (annars kanske inte).

Men ännu viktigare: Fundera över vad sakerna egentligen gör. Ska information om dem skrivas ut? I så fall vill du kanske lägga till en (abstrakt) skrivUt-metod i Sak som undertyperna får implementera på ett sätt som passar dem (en Fotboll skriver ut sin färg, exempelvis). (Ännu bättre kan vara en metod som returnerar en sträng med informationen, som klienten sedan kan göra något med.)

Det finns mycket mer att skriva om ämnet, men jag börjar så här. Du får fråga om det är mer du undrar.

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem

Tack för hjälpen. Jag ska nog lösa det med hjälp av casting nu.

Detta var bara påhittade klasser och jag förenklade det lite grann. Självklart har jag en annan lösning på ID-numren. Många if-kedjor har det dock blivit. Får hitta bättre lösningar i framtiden men detta projekt får vara som det är. Det jag gör är ett projekt till en sommarkurs som jag går på. Den innehöll inte jättemycket om arv och abstrakta metoder ingick inte så det har jag ingen större koll på. Var dock tvunget att ha med arv på projektet.

Permalänk
Medlem

Har en annan fråga nu. I MainFrame-classen har jag 3 fält som innehåller 3 olika objekt. Dessa måste jag kunna spara/öppna. Objekten är serialiserade redan men...Hur spar jag ner dessa till samma fil på enklaste/bästa sättet? OBS. Koden för sparande klarar jag själv om jag bara har ett fält som ska sparas, det jag vill ha hjälp med är själva organisationen så att det blir ett fält endast.

Ändrar helst så lite som möjligt av den nuvarande koden. Jobbar med Windows-forms och måste kalla på sparmetoder och annat från MainFrame.

Exempel av nuvarande uppbyggnad av MainFrame:

class MainFrame { private Produkt produkt; private Sak sak; private Kund kund; // Mer kod }

Tack på förhand.

Permalänk
Medlem

Jag hängde inte riktigt med på vad problemet är..

Vill du alltså att alla tre objekten ska sparas ihop eller?

Du kan ju göra en klass som innehåller som tre objekten och sen sparar/laddar du den klassen istället..

Visa signatur

EPoX 8RDA+, XP2500+, 2x256Mb PC3200 (DualCh), Club3D 9800PRO, Seagate 7200.7 160Gb 8Mb Limited edition

Permalänk
Medlem

Alltså bör jag flytta ut och ha dessa 3 fält i en ny klass och endast ett fält med nya objektets klass i MainFrame?

Eller kan jag på något sätt ha kvar dessa i MainFrame?

Permalänk
Medlem

Varför har du både Sak och Produkt. Är inte en Produkt en Sak?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Varför har du både Sak och Produkt. Är inte en Produkt en Sak?

Inget att bry sig om. Jag bara skrev något som exempel. Det ser annorlunda ut i verkligheten.