2016-12-28 2 views
1

Also habe ich eine ABSRACT-Superklasse und eine Unterklasse, die diese Oberklasse mit Feldern erweitert, die nicht in der Oberklasse deklariert sind. Gibt es eine Möglichkeit, auf diese Felder innerhalb der Oberklasse zuzugreifen? Ich kann diese Felder in der Oberklasse nicht deklarieren, da es andere Unterklassen hat, die diese Felder möglicherweise nicht haben.Können Sie auf Felder einer Unterklasse zugreifen, die nicht in der Oberklasse deklariert sind?

bearbeiten, um es deutlicher zu machen:

So bin ich eine Art von Geschäft zu machen, die verschiedene Elemente hat. So habe ich eine abstrakte Klasse namens item (mit einem Feld: price) und die verschiedenen Items sind Objekte, die die Item-Klasse erweitern und den Preis definieren. Aber es gibt auch einige spezielle Elemente, bei denen alle Instanzen desselben Elements unterschiedliche IDs haben, sie geben auch ihren Preis an. Und ein "Käufer" muss in der Lage sein, eine "Einkaufsliste" von normalen und speziellen Artikeln zu erstellen, wo der Gesamtpreis berechnet werden kann, aber Sie müssen auch in der Lage sein, die IDs der Sonderposten aus der Liste zu sehen.

bearbeiten: ein Beispiel dafür, was ich will, erreichen.

Ich habe ein kleines Beispiel

//The numbers are different for each ticket 
// and are used to denote a winner in the end. 
abstract class LotteryTicket(val numbers: String) { 
    val price: Int 
} 

class GoldTicket(numbers: String) extends LotteryTicket(person) { 
    val price: Int = 10 
} 

class SilverTicket(numbers: String) extends LotteryTicket(person) { 
    val price: Int = 5 
} 

abstract class Drink { 
    val price: Int 
} 

object Water extends Drink { 
    val price: Int = 1 
} 

object Coffee extends Drink { 
    val price: Int = 2 
} 

class Bill 

class Customer 

Die Klasse ‚Bill‘ eine Liste enthalten soll, die Getränke sowie LotteryTickets, , für die die Gesamt berechnet werden kann und der Kunde hat enthalten kann sein in der Lage, eine solche Rechnung zu machen. Die Kundenklasse benötigt auch eine Methode, die den Kauf bestätigt und überprüft, ob die Nummern auf seinem LottoryTicket für jedes von ihm gekaufte Ticket unterschiedlich sind. Denn wenn er die gleiche Nummer auf 2 Tickets hat Die Bestätigung schlägt fehl.

Antwort

0

Nicht ohne Rückgriff auf sehr schmutzige Tricks, die ich dringend empfehlen würde. Es sieht so aus, als ob Ihre Klassenhierarchie einige Probleme haben könnte - ohne konkrete Beispiele ist es schwierig, genaue Ratschläge zu geben, aber ich würde in Scala in erster Linie die Komposition mit Merkmalen und nicht die Vererbung betrachten. Für Ihr Problem, könnten Sie ein Merkmal für alles machen, die

trait Buyable { 
    def price: Int 
} 

in einem Einkaufswagen abgelegt werden kann und dann diese Eigenschaft mischten in alles, was Sie in der Lage sein wollen, in einem Einkaufswagen zu landen. Auf diese Weise können Sie kleine Vererbungsbäume für alle Arten von Produkten erstellen und einfach das Merkmal hinzufügen. Zum Beispiel

class Drink extends Buyable { 
    // Drink can set the price for all its subclasses 
    override def price = ... 
} 

abstract class LotteryTicket extends Buyable { 
    // LotteryTicket cannot, so it's abstract 
} 
class SilverTicket { 
    override def price = 20 
} 

Ihr Warenkorb ist noch nicht bewusst, funktioniert nur auf Buyable stuff:

class ShoppingCart { 
    def add(b: Buyable) ... 
} 

Natürlich können Sie auch eine gewisse Kennung bewegen konnte, und so weiter, bis Buyable, so wie Sie es brauchen.

+0

Nun, ich mache eine Art von Geschäft, das verschiedene Elemente hat. Also habe ich eine Klasse namens item (mit einem Feld: price) und die verschiedenen Items sind object, da sie nur einen Preis und sonst nichts haben. Es gibt jedoch auch einige spezielle Elemente, bei denen jede Instanz des Elements eine andere ID hat. Und ein "Käufer" muss in der Lage sein, eine "Einkaufsliste" von normalen und speziellen Artikeln zu erstellen, wo der Gesamtpreis berechnet werden kann, aber Sie müssen auch in der Lage sein, die IDs der Sonderposten aus der Liste zu sehen. –

2

Während in der Tat nicht zu empfehlen (weil es einen Konstruktionsfehler schon sagt - Sie wissen nicht, ob Sie die Unterklasse zur Hand haben, aber sie sind immer noch interessiert seine Methoden in Berufung), hier sind einige Optionen:

trait A { 
    // pattern-match to doStuff only if B: 
    this match { 
    case b: B => b.doStuff() 
    case _ => // do nothing 
    } 

    // check if type is B (not recommended) 
    if (this.isInstanceOf[B]) { 
    this.asInstanceOf[B].doStuff() 
    } 
} 

class B extends A { 
    def doStuff() {} 
} 
+0

Also und wo genau in Merkmal A greifen Sie auf ein Feld von B zu? (Bitte nicht einmal versuchen) – haffla

+0

oops - falsch gelesen die Frage - immer noch möglich, obwohl ... aktualisiert –

+0

In Ordnung, so was ich erreichen wollte, ist nicht gut, so schrieb ich ein Beispiel dafür, was ich eigentlich tun möchte. Ist das auf einfache Weise möglich? –

1

Im Allgemeinen ist dies nicht im Prinzip der objektorientierten Programmierung verfügbar. Kann sein, wenn Sie über Code ein anderes spezielles abstraktes Feld des Preises verursachen müssen, um zu arbeiten.Darüber hinaus müssen Sie die Unterklasse in der Basisklasse instanziieren, um die Felder in der Unterklasse zugänglich zu machen. Ich weiß nicht, ob dir das helfen wird, aber wenn du eine Art Struktur deiner Klassen veröffentlichen kannst und was du zu tun versuchst. Ich denke, es wird viel helfen.

+0

Ich werde ein Beispiel hinzufügen –

Verwandte Themen