【问题标题】:Abstract class for Objective-C [duplicate]Objective-C的抽象类[重复]
【发布时间】:2012-11-27 10:45:14
【问题描述】:

可能重复:
Creating an abstract class in Objective C

我想在 Objective-C 项目中创建抽象类。

但是,我找不到诸如“抽象”(在 java 中)、“虚拟”(在 c++ 中)之类的想法。

Objective-C 没有抽象概念吗?谢谢。

【问题讨论】:

    标签: objective-c abstract-class


    【解决方案1】:

    正式地说,不。抽象类是通过在基类中存根方法来实现的,然后记录子类必须实现这些方法。作者有责任编写与类契约匹配的类,而不是编译器检查缺失的方法。

    Objective-C 有 protocols,类似于 Java 接口。如果您正在寻找与纯虚拟 C++ 类或Java 中的接口 等价物,这就是您想要的。

    【讨论】:

    • 我要进一步说,Objective-C 真的不抽象类。使用支持 Objective-C 的鸭子类型理想的协议,而不是 C++ 的通用基类。
    • 您可以强制重写关键方法,方法是让基类实现它们以引发描述性异常。
    • @WadeTregaskis:在结构良好的 Objective-C 中,我希望大量使用协议并避免这些 faux-C++ 特性。也就是说,生产型 Objective-C(可悲)通常是由了解大量 C++ 而不太了解 Objective-C 的人编写的。不妨用那些工程师理解的术语来表达。
    【解决方案2】:

    没有抽象类,但您可以使用 classprotocol 的组合生成类似的东西(类似于 Java 的 接口)。首先将您的抽象类划分为您希望为其提供默认实现的方法和您需要子类来实现的方法。现在在@interface 中声明默认方法并在@implementation 中实现它们,并在@protocol 中声明所需的方法。最后从 class<protocol> 派生您的子类 - 一个实现协议的类。例如:

    @interface MyAbstract
    
    - (void) methodWithDefaultImplementation;
    
    @end
    
    @protocol MyAbstract
    
    - (void) methodSubclassMustImplement;
    
    @end
    
    @implementation MyAbstract
    
    - (void) methodWithDefaultImplementation { ... }
    
    @end
    
    @interface MyConcreteClass: MyAbstract<MyAbstract>
       ...
    @end
    
    @implementation MyConcreteClass
    
    // must implement abstract methods in protocol
    - (void) methodSubclassMustImplement { ... }
    
    @end
    

    如果您担心对类和协议使用相同的名称,请查看 Cocoa,其中 NSObject 遵循此模式...

    HTH

    【讨论】:

    • 我发现的问题是,如果我在这些方法中的任何一个上调用 super,那么我会收到警告“[super class] may not respond to '[method name].'”唯一的方法我可以摆脱这个警告是在抽象类中实现协议。但如果我这样做,它们实际上会成为击败对象的公共方法......
    • @jowie - 我不明白你在做什么。超类没有实现抽象方法,这就是重点——所有子类都实现了抽象方法。您希望调用 super 以获取抽象方法做什么?
    • 我想我可能没有正确使用抽象模型。我希望我的超类做所有默认情况下的东西,但是让我的子类覆盖某些方法,添加他们自己的东西并能够为默认的东西调用 super。
    • @jowie - 您正在描述正常的继承。您只需在基类中声明所有方法并为它们提供默认实现。任何派生类都可以覆盖基类方法并使用super 调用基类实现。
    • 是的 - 我想我只需要公开它们,因为 obj-c 中没有保护。
    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 2012-06-28
    • 2018-07-11
    • 1970-01-01
    • 2011-08-05
    • 2012-10-03
    • 2011-01-19
    • 1970-01-01
    相关资源
    最近更新 更多