Нека кажем, че имам клас Place
, изглежда така:
class Place{
let name:String
let description:String
let location:CLLocation?
}
Най- location
-променлива е по избор.
Възможно ли е да се създаде подклас от този клас, където location
-променлив е длъжен?
Това би било възможно, ако премахна променливата за местоположение Place
и просто направи това:
class LocatedPlace:Place{
let location:CLLocation
}
Но има ли начин да има незадължителна променлива в клас и да направи същата променлива, необходима в подклас?
опитах override let location:CLLocation
, но вземете съобщението:
Cannot override with a stored property "location"
Отговори:
2 за отговор № 1Както беше обсъдено в коментарите на вашия въпрос, не можете да направите location
не е задължително в подкласа, тъй като това би нарушило Принцип на заместване на Лисков.
CLLocation?
и CLLocation
са различни видове, точно както String
и CLLocation
са различни видове и не бихте очаквали да можете да направите location
а String
в LocatedPlace
.
Това, което можете да направите, е да наложите изискването си чрез обектива на обекта, като направите location
стойност задължителна и скриване на инициатора на суперклас:
class Place{
let name:String
let description:String
let location:CLLocation?
init(name: String, description: String, location: CLLocation? = nil) {
self.name = name
self.description = description
self.location = location
}
}
class LocatedPlace: Place {
private override init(name: String, description: String, location: CLLocation? = nil) {
super.init(name: name, description: description, location: location)
}
init(name: String, description: String, location: CLLocation) {
super.init(name: name, description: description, location: location)
}
}
Имайте предвид, че location
собственост на LocatedPlace
например ще остане незадължителен и ще трябва да го развиете, когато го препратите.
0 за отговор № 2
Без да знам какво всъщност се опитваш да направиш, ето как бих моделирал това:
import CoreLocation
protocol Place {
var name: String { get }
var description: String { get }
var location: CLLocation? { get }
}
struct LocatedPlace: Place {
let name: String
let description: String
var _location: CLLocation
var location: CLLocation? { return _location }
}