/ / Възможно ли е да се изисква незадължителна променлива в подклас? - бърза

Възможно ли е да се изисква незадължителна променлива в подклас? - бързо

Нека кажем, че имам клас 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 }
}