我来自ECMAScript类似语言的Objective-C,所以这可能是错误的问题,但我无法确定如何提出它:
我在头文件中定义了一个接口。我不想直接实现它,我只想让类使用它。
So say: Car.h is implemented by Telsa.m, Mercedes.m, Peugeot.m, etc.
这可能吗?我没有使用" car"的默认实现,但我想确保每个品牌都实现了界面,所以我可以通过任何"车载"可靠的。我不希望它能成为一辆汽车。
提前感谢任何见解。
答案 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
优点是您必须在基类的每个子类中实现相同的方法。因此它缩短了实现。
当然,你可以把它结合起来:
@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