Swift中的多态性(如果没有)
我有一个swift代码:解释多态性的概念Swift中的多态性(如果没有),swift,polymorphism,Swift,Polymorphism,我有一个swift代码:解释多态性的概念 //Polymorphism class Person { var name:String="Guest" var age:Int=0 init(name:String) { self.name=name self.age=0 } init(name:String, age:Int) { self.name=name self.age=age } func Update(name:String) { sel
//Polymorphism
class Person {
var name:String="Guest"
var age:Int=0
init(name:String) {
self.name=name
self.age=0
}
init(name:String, age:Int) {
self.name=name
self.age=age
}
func Update(name:String) {
self.name=name
}
func Upgrade() {
self.age++
}
}
class Student:Person
{
var average:Float=100
func IsOk()->Bool {
return average > 80
}
init(name:String, average:Float) {
super.init(name: name)
self.average=average
}
}
class Teacher:Person {
var Salary:Float=2000
init(name:String, age:Int, Salary:Float){
super.init(name: name, age: age)
self.Salary=Salary
}
func GetNetSalary()->Float {
return 0.8*self.Salary
}
override func Upgrade() {
super.Upgrade()
Salary*=1.1 // add 10% to salary
}
}
var t1:Teacher=Teacher(name: "Ahmed", age: 28, Salary: 3000)
var st1=Student(name:"Test", average: 70)
var p1:Person=Person(name: "abc")
var p2:Person=Student(name: "Student1", average: 100) //up casting
var p3:Person=Teacher(name: "Teacher", age: 40, Salary: 3008)
var arr=[t1, st1, p1, p2, p3] //array of persons and teachers and students
for instance in arr {
if instance is Student {println("This is student")}
if instance is Teacher {println("This is teacehr")}
}
在for循环的最后,我如何设置这样一个条件来确定数组中的元素是否只是一个人?
因为当我打字时:
if instance is Person {println("This is a Person")}
这给了我一个错误,因为这个条件总是正确的 也许您可以测试该元素是否为
教师
?如果不是,则必须是人
试试这个:
for instance in arr {
if instance.dynamicType == Person.self {print("This is a Person")}
if instance.dynamicType == Student.self {print("This is student")}
if instance.dynamicType == Teacher.self {print("This is teacehr")}
}
有关这方面的更多信息,请参见。已编辑
你在问:
我怎么能设置这样一个条件来判断数组中的元素是否只有一个人
在强静态类型化语言中,如果无法访问对象的运行时类型,则无法执行此操作。但是,在Swift中,您可以通过
dynamicType
方法使用语言的反射属性来获得这样的类型。我应该说@Renzo的答案已经过时,dynamicType
已被弃用。你们必须使用这个方法。还有一个建议:如果您想知道可选对象的确切类型,请先将其展开,然后将其传递给type(of:)
class A{}
B类:A{}
b:A?=B()
打印(“\(类型:b))”//您将得到可选的(A)
如果让温度=b{
打印(“\(类型:temp))”//您将得到(B)
}
isKindOfClass提供了什么样的输出?将来可能重复的,从将问题归结为复制问题的绝对必要示例开始。这段代码与此相去甚远。你的数组是什么类型的<代码>[个人]?如果不是老师
,可能是学生
。如果我们添加一个看门人
,家长
,校长
,顾问
,等等,会发生什么呢?现在突然在别处添加代码会破坏这里的代码,无论这个测试在哪里。。。另外,正如我的评论链接的问题所显示的,我们可以只检查确切的类…哦,对不起,这是我的错,也许你可以与类名称进行比较。哦,什么?如果对象是Person
——而不是子类——dynamicType
将反映这一点。不管变量的类型是什么……例如,在这种语言中,您无法访问对象的运行时类型?例如OCaml,其中类型信息在编译时完全管理,在运行时不存在。