Laden...

Interfaces ohne Felder?

Erstellt von Taladan vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.248 Views
Taladan Themenstarter:in
582 Beiträge seit 2008
vor 15 Jahren
Interfaces ohne Felder?

Hallo,

ich habe einen Codebaustein den ich sehr häufig in Classen wiederverwenden werde. Dafür sind ja interfaces gedacht, doch diese dürfen nicht mit Felder erstellt werden. Nun weiß ich allerdings nicht, wie ich die dann erstellen muß.

In diesen Fall möchte ich verschiedenen Gebäudetypen die Preisschnittstelle hinzufügen z.B. der Schmiede, der Schänke, der Taverne oder dem Gasthaus. Alle leiten sich der abstrakten Klasse BasisGebauede ab. Ebenfalls leiten sich Privathaus, Wohngebäude, Wachturm, Stadttor und Tempel davon ab. Da hier aber nichts verkauft wird, soll die Schnittstelle Preis erst gar nicht implementiert werden.

Hier mein Interfacemodel was ich gerne nutzen würde:


interface IPreis
    {
        private int preis;

        public int Preis
        {
            get { 
                return this.preis; 
            }
            set { 
                this.preis = Preis;
                switch (Preis)
                {
                    case 1, 2:
                        preisklasse = "sehr billig";
                        preisniveau = 70;
                        break;
                    case 3,4,5:
                        preisklasse = "billig";
                        preisniveau = 85;
                        break;
                    case 14,15,16,17:
                        preisklasse = "teuer";
                        preisniveau = 120;
                        break;
                    case 18,19:
                        preisklasse = "sehr teuer";
                        preisniveau = 150;
                        break;
                    case 20:
                        preisklasse = "Wucher";
                        preisniveau = 200;
                        break;
                    default:
                        preisklasse = "durchschnittlich";
                        preisniveau= 100;
                        break;
                }
            }
        }

        private string preisklasse;
        public string PreisKlasse
        {
            get { return this.preisklasse; }
            set { this.preisklasse = PreisKlasse; }
        }

        private int preisniveau;
        public int Preisniveau
        {
            get { 
                return this.preisniveau; 
            }
            set { 
                this.preisniveau = Preisniveau;
                if (Helper.between(Preisniveau, 0, 70)) { this.preisklasse = "sehr billig", this.preis = 2};
                else if (Helper.between(Preisniveau, 71, 99)) { this.preisklasse = "billig", this.preis = 5};
                else if (Helper.between(Preisniveau, 100, 119)) { this.preisklasse = "durchschnittlich", this.preis = 13};
                else if (Helper.between(Preisniveau, 120, 149)) { this.preisklasse = "teuer", this.preis = 17};
                else if (Helper.between(Preisniveau, 150, 199)) { this.preisklasse = "sehr teuer", this.preis = 19};
                else if (Preisniveau > 200) { this.preisklasse = "Wucher", this.preis = 20};
            }
        }

        public void randomPreis()
        {
            Preis = Wuerfeln.W20;
        }

    }

Gruß dat Tala

X
2.051 Beiträge seit 2004
vor 15 Jahren

Erstelle noch eine weitere Basisklasse abgeleitet von BasisGebauede . Diese Klasse implementiert dann deine Schnittstelle. Und von der Klasse leitest du alle Gebäudetypen die diese Schnittstelle brauchen.

anderen (Privathaus, Wohngebäude,..) werden direkt von der BasisGebauede Klasse abgeleitet


class BasisGebauede 
{
}

class PreisBasisGebauede : IPreis
{
}

class Privathaus : BasisGebauede 
{
}

class Schmiede : PreisBasisGebauede 
{
}
225 Beiträge seit 2006
vor 15 Jahren

aloha,

imho ist das hier erstmal ein logisches problem.
wenn du einen preis bei BasisGebäude implementierst, gibst du damit an, dass ALLE gebäude einen preis/preisniveau haben, was bei dir jedoch nicht der fall ist.

wenn ich es richtig verstanden habe, sollte dein modell in etwa so aussehen:

Schmiede <- GebäudeMitPreisNiveau <- BasisGebäude
Privathaus <- Basisgebäute

es gibt also eine abstrakte klasse BasisGebäude mit allen eigenschaften, die ein gebäude hat (also kein preisniveau) und eine abstrakte klasse GebäudeMitPreisNiveau, die von BasisGebäude erbt.
dann kannst du die restlichen gebäude, je nach typ, von den entsprechenden gebäudeklassen erben lassen.

a hui hau
puppet

EDIT:

ich habe einen Codebaustein den ich sehr häufig in Classen wiederverwenden werde. Dafür sind ja interfaces gedacht das sehe ich nicht so. ein interface soll eine definierte schnittstelle zwischen zwei (oder mehreren) klassen darstellen. was du meinst sind abstrakte klassen.

Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: G
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^