在swift中将子类对象声明为超类,但对象仍然表现为子类

时间:2016-03-29 23:42:51

标签: swift inheritance uiimageview polymorphism

我正在关注一个Swift教程,我们编写了一个名为DragImg的UIImageView子类,并在该子类中覆盖了一些函数,即touchesBegan,touchesMoved和touchesEnded。

然后我进入身份检查器,查看我想要应用子类的图像,并将类更改为DragImg,然后将它们作为插座连接到ViewController.swift。

但是,在我的ViewController.swift文件中,我将它们声明为UIImageView对象,即

@IBOutlet weak var HeartImg: UIImageView!

而不是

@IBOutlet weak var HeartImg: DragImg!

即使我没有改变这一点,图像仍然按照我们在子类中编写的函数定义运行。

我不确定为什么这仍然有效,因为我认为超类无法访问子类的功能。这是否意味着上述声明在很大程度上是多余的,唯一有所作为的是改变身份检查员中的类?

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

这是正确的,因为您在标识Inspector中使用了DragImg,它实际上是创建实例时使用的类。即使您在UIViewController中使用了UIImageView,它仍然是DragImg对象实例。如果你想拥有UIImageView,那么将标识Inspector更改回UIImageView。

答案 1 :(得分:0)

当你创建一个子类时,你正在定义一个&#34; is-a&#34;关系。你的子类const int ROWS = 10; const int COLS = 10; bool mazeEscape(char maze[ROWS][COLS],int row,int col) { bool result = false; if (row < 0 || row >= ROWS || col < 0 || col >= COLS) return false; if (mazeEscape(row - 1, col)) // recursively move up result = true; else if (mazeEscape(row + 1, col)) // recursively move down result = true; else if (mazeEscape(row, col - 1)) // recursively move left result = true; else if (mazeEscape(row, col + 1)) // recursively move right result = true; // Pick up the bread crump return result; if (maze[row][col] == '@') return true; if (mazeEscape(row - 1, col)) // recursively move up return true; else if (mazeEscape(row + 1, col)) // recursively move down return true; else if (mazeEscape(row, col - 1)) // recursively move left return true; else if (mazeEscape(row, col + 1)) // recursively move right return true; else return false; } 是一个(或者我应该说是-a)UIImageView。您应该可以在代码中的任何位置将其称为UIImageView,因为它是一个。

让你的插座参考课程&#39;超类完全可以。