Ios 类簇的适当子类化
在观看了iOS技术讲座并阅读了有关类群集的内容后,我决定将遗留的iOS 6代码提取到一个私有子类中:Ios 类簇的适当子类化,ios,objective-c,Ios,Objective C,在观看了iOS技术讲座并阅读了有关类群集的内容后,我决定将遗留的iOS 6代码提取到一个私有子类中: @interface MyUIView : UIView @end // public @interface MyUIViewiOS6 : MyUIView @end // private @interface MyUIViewiOS7 : MyUIView @end // private @implementation MyUIView + (id)all
@interface MyUIView : UIView @end // public
@interface MyUIViewiOS6 : MyUIView @end // private
@interface MyUIViewiOS7 : MyUIView @end // private
@implementation MyUIView
+ (id)alloc
{
// Don't loop on [super alloc]
if ([[self class] isSubclassOfClass:[MyUIView class]] &&
([self class] != [MyUIViewiOS6 class]) &&
([self class] != [MyUIViewiOS7 class]))
{
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
return [MyUIViewiOS6 alloc];
} else {
return [MyUIViewiOS7 alloc];
}
}
return [super alloc];
}
// Common implementation
@end
@implementation MyUIViewiOS6
// Legacy code
@end
@implementation MyUIViewiOS7
// iOS specific code
@end
@interface MyRedUIView : MyUIView @end
然后像这样初始化:
[[MyRedUIView alloc] init]
将改为分配MyUIViewiOS6或MyUIViewiOS7类型的对象。是否有一种方法可以调整此模式以支持子类化,从而使MyRedUIView的超类动态切换到MyUIViewiOS6或MyUIViewiOS7?您已经遇到了经典的双重继承问题。您希望成为
RedUIView
或GreenUIView
并成为myuiviews6
或myuiviews7
视图
因为objective-c不支持双重继承,所以您必须决定您是什么样的人和您的行为方式之间的区别。任何决定你是什么的东西,你都要把它放在课堂上。任何决定你如何行动的东西都会进入一个@协议
,然后就可以实现了
我会将MyUIView
子类化,因为myuiviews6
和myuiviews7
对应于您的身份,然后为某些功能实施Red
或Green
协议:
@interface MyRedUIView : MyUIView<RedProtocol> @end
如果他们两个都是你,那么你必须使用四个独立的类
下面是一个使用类别的示例。假设您拥有问题中指定的MyUIView: GreenView.h
#import "MyUIView.h"
#import "Green.h"
@interface MyUIView (GreenUIView) <Green>
-(BOOL) isGreen;
@end
@interface GreenView : MyUIView @end
@protocol Green <NSObject> @end
绿色.h
#import "MyUIView.h"
#import "Green.h"
@interface MyUIView (GreenUIView) <Green>
-(BOOL) isGreen;
@end
@interface GreenView : MyUIView @end
@protocol Green <NSObject> @end
您需要添加更多的代码。
MyRedUIView
从何而来。@Zaph这就是OP要问的:如何对类集群进行子类化。MyRedUIView是子类。@David当然可以,但OP应该提供他在MyUIView
、MyUIViewiOS6
和MyUIViewiOS7
中尝试过的内容,OP刚刚添加了它。您的+alloc
可以简化为:如果(self==[MyUIView类]{return iOS7()?[MyUIViewiOS7 alloc]:[MyUIViewiOS6 alloc];}else{return[super alloc];}
(假设您在某处实现了BOOL iOS7()
函数)如果MyUIView
声明为问题中的状态,那么您的conformsToProtocol
调用肯定会返回NO
?您能否澄清您的解决方案是如何工作的?您可以有一个超类MyUIView
和两个子类:@interface MyRedUIView:MyUIView@end
和@interface MyGreenUIView:MyUIView@end
如果问题中定义了MyUIView
,并且myuiviews6
或myuiviews7
被alloc
选择,则@interface MyRedUIView:MyUIView@end
将不会返回YES
到一致性协议协议方法,或提供协议方法等,因为它是实际上是两个私有类中的一个。也许我有点笨,但从你的回答中不清楚你是否要删除这两个类(以及alloc
中相应的选择),或执行其他操作。如果要删除这两个类,协议的好处是什么?使用函数示例更新了答案您添加的代码与原始答案不匹配。在答案中,您有MyRedUIView
实现协议,在添加的代码中,是MyUIView
实现协议协议。原始答案不起作用。虽然添加的代码可以正常工作,但如果您按照相同的模式定义RedView
,则会发现GreenView
实例返回YES
forisRed
。。。
#import "GreenView.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
GreenView* view = [[GreenView alloc] init];
NSLog(@"%@", [view isGreen]?@"yes":@"no");
return YES;
}
@end