如何在Objective-C中实现没有默认实现的接口?

时间:2016-04-13 02:54:35

标签: objective-c interface

我来自ECMAScript类似语言的Objective-C,所以这可能是错误的问题,但我无法确定如何提出它:

我在头文件中定义了一个接口。我不想直接实现它,我只想让类使用它。

So say: Car.h is implemented by Telsa.m, Mercedes.m, Peugeot.m, etc.

这可能吗?我没有使用" car"的默认实现,但我想确保每个品牌都实现了界面,所以我可以通过任何"车载"可靠的。我不希望它能成为一辆汽车。

提前感谢任何见解。

3 个答案:

答案 0 :(得分:5)

您正在寻找的是协议,使用@protocol在Objective-C中定义。这些可能令人困惑,相当于Java风格的接口。您可以定义一个类来实现任意数量的协议,并且不需要默认实现。请阅读Apple的Working with Protocols了解详细信息。

HTH

答案 1 :(得分:2)

在objective-c中,当你想编写一个类时,你必须指定类接口(通常在.h文件中的@interface)和类implmentation(.m文件)

当你想要定义任何其他类可以在objective-c中实现的接口时,这个接口称为协议。

@protocol XYZPieChartViewDataSource
- (NSUInteger)numberOfSegments;
- (CGFloat)sizeOfSegmentAtIndex:(NSUInteger)segmentIndex;
@optional
- (NSString *)titleForSegmentAtIndex:(NSUInteger)segmentIndex;
- (BOOL)shouldExplodeSegmentAtIndex:(NSUInteger)segmentIndex;
@required
- (UIColor *)colorForSegmentAtIndex:(NSUInteger)segmentIndex;
@end

因此,您可以编写一个实现此协议的类,为了首先执行此操作,您必须声明您的类实现此协议(.h文件)。

@interface MyClass : NSObject <XYZPieChartViewDataSource>
...
@end

之后你必须编写你想要实现的方法,你必须编写所需的方法,如果你需要可选的方法你可以编写

- (BOOL)shouldExplodeSegmentAtIndex:(NSUInteger)segmentIndex {
// do someting
}

- (UIColor *)colorForSegmentAtIndex:(NSUInteger)segmentIndex {
// do someting 
}

正如他们所指出的,您可以查看协议文档:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithProtocols/WorkingwithProtocols.html

答案 2 :(得分:0)

使用协议是一个很好的模式,因为它非常灵活。但是查看你的类Tesla ......似乎就是这样,这些是基类Car的子类。

在这种情况下,实现使Car成为部分抽象基类可能更方便。这意味着Car

  • 根据需要声明API
  • 部分实现API
  • 永远不会被实例化

优点是您必须在基类的每个子类中实现相同的方法。因此它缩短了实现

当然,你可以把它结合起来:

@interface Car : NSObject <CarProtocol>
…
@end

@implementation Car
// Define methods that are common for all subclasses of Car
// Define methods included in CarProtocol, but not definable in a base class empty. 
…
@end

@interface Tesla : Car // Protocol is inherited
…
@end

@implementation Tesla
// Override methods that needs a special behavior for this subclass
// Override methods that are not definable at the base class
// Add method definitions that are special to Tesla (i. e. Power plug)
…
@end

@interface AmphibiousCraft : NSObject<CarProtocol, ShipProtocol> // Implementation of Car is no real help
…
@end

@implementation AmphibiousCraft
…
@end