- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以我是 iOS 开发的新手,在实习期间一直致力于对具有相对较大的 objective-c 代码库的应用程序进行细微更改。我一直在从 Treehouse 快速学习(哇,爱他们!),我刚刚学习了协议(protocol)。目前,它们应该在某些情况下使用,教师使用了这个例子。
假设您的公司有两种不同类型的员工:工资和小时工(很常见)。现在,他们都将从一个名为 Employee 的父类(super class)继承,并且都必须调用一个名为“pay”的函数来支付员工工资。您如何强制这些类来实现该功能?当然,使用协议(protocol),但这需要您记住将其添加到函数声明中。有没有一种方法可以将协议(protocol)添加到父类(super class)“Employee”,然后从该类继承的任何东西都必须遵循属于该父类(super class)的协议(protocol)。还有另一种方法吗?谢谢!
最佳答案
您正在寻找的是一个抽象类。 抽象类的目的是作为具体类继承的基类,但不能直接实例化抽象类。
如果 Employee
是一个抽象类,那么任何实际实例化 Employee
实例的尝试都会被编译器报告为错误。您需要实例化 Employee
的具体子类,例如 SalariedEmployee
或 HourlyEmployee
。
Employee
类的定义将包括需要 calculatePay
方法,如果具体子类未实现该方法,则会再次出现编译时错误。
现在,坏消息来了。 Objective-C 和 Swift 都不支持抽象类。
您可以通过提供一个方法的实现来提供类似类型的类,如果它没有被子类覆盖则抛出异常。这给出了运行时错误而不是编译时错误。
例如
class Employee {
var givenName: String
var surname: String
...
init(givenName: String, surname: String) {
self.givenName = givenName
self.surname = surname
}
func calculatePay() -> Float {
fatalError("Subclasses must override calculatePay")
}
}
class SalariedEmployee: Employee {
var salary: Float
init(givenName: String, surname: String, annualSalary: Float) {
salary = annualSalary
super.init(givenName: givenName, surname: surname)
}
override func calculatePay() -> Float {
return salary/12 // Note: No call to super.calculatePay
}
}
无论calculatePay
是基类的一部分还是通过添加协议(protocol)一致性的扩展分配给基类,结果都是一样的;
Employee
类需要生成某种错误的函数的默认实现您可以为每个子类分别分配一个协议(protocol),例如 Payable
,但是由于该协议(protocol)不是基类的一部分,您不能这样说:
var employees[Employee]
for e in employees {
let pay = e.calculatePay()
}
你将不得不使用稍微复杂一点的:
for e in employees {
if e is Payable {
let pay = e.calculatePay()
}
}
关于ios - 将协议(protocol)添加到父类(super class),这将强制从它继承的其他类实现协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47243822/
我只想知道它们之间的区别: .class .class{ font-size:14px; } 对比: .class > .class{ font-size:14px; } 是一样的东西吗? 最佳答案
PrimeFaces 文档的以下摘录使标题中描述的两个选择器之间似乎存在差异: .ui-widget, .ui-widget .ui-widget { font-size: 90% !imp
我正在尝试选择特定值。但我遇到了一个问题。 我有两个元素,一个有 X Y,另一个有 X Y Z。 当选择 X Y Z 时,我也收到 X Y 的值...有没有办法让它寻找 X AND Y AND Z 而
.class.class 和 .class .class 有什么区别? 最佳答案 .class .class 匹配类 .class 的任何元素,这些元素是类 .class< 的另一个元素的后代/. .
我正在研究 Classname.class 和 Classname.class.toString() 并发现了一些不寻常的东西。 .class 在同一个类上运行时似乎等同于 .class。尽管 .cl
我试图在Dart中扩展列表并在此列表中使用另一个类。 这是我的示例,其中注释出了问题: import "Radio.dart"; // extends ListBase { List ra
我有一个很大的“经理”类,我认为它做得太多了,但我不确定如何将它划分为更多逻辑单元。 一般来说类主要由以下方法组成: class FooBarManager{ GetFooEntities();
我在一个文件中定义了一个抽象父类(super class),在另一个文件中定义了一个子类。我需要父类(super class)文件和堆栈跟踪报告来找到一个包含它。 但是,当它到达“extends”行时
我在 A. Alexenderscu 的现代 C++ 设计中找到了一些模板示例 作者使用以下行的地方 template class CheckingPolicy // class SmartPt
看一下这段代码: public static class A { public void doA() { } } public static class B extends A {
我有两个具有 .body 类的 div,但是,一个位于另一个具有 .box 类的 div 中 - 如下所示: 我只想为 .box 内部的 .body 设置样式...但我在下面所
我一定是遗漏了 C++ 规范中的某些内容,因为我无法解释为什么以下代码可以成功编译: class MyClass { static void fun(); }; int main() { MyClas
我正在尝试在 python 中“模拟”命名空间。我使用内部和外部类层次结构来创建我的命名空间。例如,您希望将文件(如资源)的路径保存在一个位置。我试过这样的事情: src = #path to sou
在试验 online crystal compiler 时(这太棒了),我遇到了一个我似乎无法找到解释的错误: class Person class Current < self end
在查看我的一段代码时,我陷入了如下的一条语句。 TMyObjectClass = TMyObject 类; 我有点困惑,不知道这句话是什么意思。由于 TMyObjectClass 在该语句上方没有声明
我正在编写一个简单的应用程序,以学习一些基本的Dart编程,但无法弄清楚其结构和包含的内容-我得到了一个重复的类Point 首先,我有一个叫做MouseTrack的主类。它将初始化列表并产生循环。 #
在 org.springframework.core.SerializableTypeWrapper (版本 5.2.3),第 112 行有以下代码: if (GraalDetector.in
我希望将鼠标悬停在子导航中的列表项上,以激活页面上该类别中所有项的类(不仅仅是父元素或同级元素)。有任何想法吗?这是我的意思的一个例子: img.BLUE {border:1px solid #FF
我正在通过 ClassLoader 加载类: Class clazz = urlClassLoader.loadClass(name.substring(0, name.length() - 6).r
以下简化的类在从 get() 返回值时执行不同的操作,具体取决于该类是被赋予 double 值还是数组作为模板参数: #include "array" #include "type_traits" t
我是一名优秀的程序员,十分优秀!