Ios 类簇的适当子类化

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

在观看了iOS技术讲座并阅读了有关类群集的内容后,我决定将遗留的iOS 6代码提取到一个私有子类中:

@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
for
isRed
。。。
#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