ios - 子类或协议(protocol),如何?

标签 ios inheritance uiview swift2 protocols

我正在开发一个 iOS 应用程序,其中有一个屏幕显示一些相关搜索的过滤器。现在,我将所有这些过滤器制作为自定义 UIView,因为它们都有相当不同的 UI,并且必须在不同的屏幕上重复使用。尽管它们存在差异,但它们都为管理它们的 View Controller 提供了一个通用接口(interface),因此 View Controller 不关心 filterView 做什么以及如何做某事。它只关心将一些数据传递给它们并通过它们共有的属性检索它们的状态。它们都有不同的类,它们是 FilterView 的子类和 UIView 的子类。这个 FilterView 类提供了一个所有这些子类都采用的接口(interface)。

这种方法工作正常,但问题是 filterView 应该呈现的所有方法和属性都在基类 FilterView 中声明,如果某些特定的过滤器没有实现某个行为,它默认为其父类(super class)提供的行为过滤 View 。我不想要这个。我希望每个 FilterView 子类都需要提供 FilterView API 的实现,或者提供它们自己的默认值而不是父类(super class)的默认值。

如果我使用协议(protocol)来实现此行为,我将失去所有这些类强制成为 UIView 的能力,这也是一项要求。

您能否建议我应该使用哪种设计模式来更好地管理所有不同的 FilterView 子类。

最佳答案

好吧,如果您认为您所有的过滤器对象都需要提供一个 UIView 而不是明确地成为一个,您可以将此要求添加到协议(protocol)中。例如:

@protocol FilterObject 

- (UIView *)viewForFilter;

@end

// Swift
protocol FilterObject {
    func viewForFilter() -> UIView
}

然后在实际上 UIView的类中像这样实现它:

- (UIView *)viewForFilter {
    return self;
}

// Swift
func viewForFilter() -> UIView {
    return self
}

为了完整起见,您还可以通过在调用子类的基实现时抛出异常来“强制”要求在子类中实现方法:

- (void) methodWithoutBaseImplementation {
    // this goes in the base class
    [NSException raise:NSInternalInconsistencyException format:@"This method needs to be implemented by subclasses! - %@", NSStringFromSelector(_cmd)];
}

// Swift
func methodWithoutBaseImplementation() {
    NSException.raise(NSInternalInconsistencyException, format:"This method needs to be implemented by subclasses! - \(__FUNCTION__)")
}

这种使 Objective-C/Swift 类“抽象”的模式可以在一些外部库中找到。请注意,这在 Swift 中更难实现,因为其中没有动态分派(dispatch)——这意味着如果您将子类转换为基类并调用方法,将调用基类实现。 不过,我建议不要这样做,因为协议(protocol)方法更安全,因为它不会创建导致应用程序崩溃的路径。我添加此示例只是为了说明可能性和完整性。

关于ios - 子类或协议(protocol),如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38821962/

相关文章:

java - 扩展 JFrame 的 Frame 类中存在的方法无法在 main() 中调用

使用和不使用原型(prototype)的 JavaScript 继承

python - 如何有效地传递参数(python 中的**kwargs)

ios - 在 View Controller 之间保留自定义选项卡栏 View 状态

ios - 自定义按钮回推

ios - UIActivityViewController 在 Testflight 中崩溃,但在从 Xcode 构建时不会崩溃

javascript - 通过 HTML5/JavaScript 从手机发送短信

ios - IB_DESIGNABLE 和 IBINSTECTABLE UIImageView

ios - 无法在 Swift 中使用时间延迟为 UIImage 设置动画

ipad - 在 iOS 设备上安装开发的应用程序时会出错吗