类族的写法

http://mdsa.51cto.com/art/201507/484133_4.htm


这个模式的精妙的地方在于,调用者可以完全不管子类,事实上,这可以用在设计一个库,可以用来交换实际的返回的类,而不用去管相关的细节,因为它们都遵从抽象超类的方法。

我们的经验是使用类簇可以帮助移除很多条件语句。

一个经典的例子是如果你有为 iPad 和 iPhone 写的一样的 UIViewController 子类,但是在不同的设备上有不同的行为。

比较基础的实现是用条件语句检查设备,然后执行不同的逻辑。虽然刚开始可能不错,但是随着代码的增长,运行逻辑也会趋于复杂。 一个更好的实现的设计是创建一个抽象而且宽泛的 view controller 来包含所有的共享逻辑,并且对于不同设备有两个特别的子例。

通用的 view controller 会检查当前设备并且返回适当的子类。

@implementation ZOCKintsugiPhotoViewController 

- (id)initWithPhotos:(NSArray *)photos
{
    if ([self isMemberOfClass:ZOCKintsugiPhotoViewController.class]) {
        self = nil; 

        if ([UIDevice isPad]) {
            self = [[ZOCKintsugiPhotoViewController_iPad alloc] initWithPhotos:photos];
        }
        else {
            self = [[ZOCKintsugiPhotoViewController_iPhone alloc] initWithPhotos:photos];
        }
        return self;
    }
    return [super initWithNibName:nil bundle:nil];
} 

@end
上面的代码的例子展示了如何创建一个类簇。首先,[self isMemberOfClass:ZOCKintsugiPhotoViewController.class] 来避免在子类中重载初始化方法,来避免无限的递归。当 [[ZOCKintsugiPhotoViewController alloc] initWithPhotos:photos] 得到调用的时候之前的检查会变成 true 的,self = nil 是用来移除所有到 ZOCKintsugiPhotoViewController 实例的引用的,它会被释放,按照这个逻辑来检查哪个类应该被初始化。 让我们假设在 iPhone 上运行了这个代码, ZOCKintsugiPhotoViewController_iPhone 没有重载initWithPhotos:,在这个情况下,当执行 self = [[ZOCKintsugiPhotoViewController_iPhone alloc] initWithPhotos:photos]; 的时候,ZOCKintsugiPhotoViewController 会被调用,并且当第一次检查的时候,这样不会让ZOCKintsugiPhotoViewController 检查会变成 false 调用return [super initWithNibName:nil bundle:nil]; ,这会让 继续初始化执行正确的初始化之前的会话。


类族的写法

时间: 2024-10-04 00:45:05

类族的写法的相关文章

第十一周 项目四 类族的设计】

项目4 - 类族的设计] 按以下的提示,由基类的设计和测试开始,逐渐地完成各个类的设计,求出圆格柱体的表面积.体积并输出并且完成要求的计算任务: (1)先建立一个Point(点)类,包含数据成员x,y(坐标点),实现需要的成员函数,并设计main函数完成测试: (2)以Point为基类,派生出一个Circle(圆)类,增加数据成员r(半径),以及求面积的成员函数area,实现其他需要的成员函数,设计main函数完成测试: (3)再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类

Objective-C类族和工厂模式

本文转载至 http://www.cocoachina.com/ios/20141124/10296.html 相信大家都了解GoF的<Design Patterns>中提到的23种设计模式,其中将常见的设计模式分为三大类:创建型模式.行为型模式.结构型模式.而在<Clean Code>中也提到建造酒店的例子,系统中对象的构建和使用应当分离开,那么应该怎么构建对象更加整洁和符合使用场景就很重要. 在iOS的系统类库中也有一种方式使得开发者不必关注类中具体的存储实现,但可以根据不同需

C++第11周(春)项目4 - 类族的设计

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目4 - 类族的设计]按下面的提示,由基类的设计和測试開始,逐渐地完毕各个类的设计,求出圆格柱体的表面积.体积并输出而且完毕要求的计算任务:    (1)先建立一个Point(点)类,包括数据成员x,y(坐标点),实现须要的成员函数,并设计main函数完毕測试:    (2)以Point为基类,派生出一个Circle(圆)类,添加数据成员r

第十三周(-形状类族的中的纯虚函数)

/* *copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名:第十三周(-形状类族的中的纯虚函数) *作者:王忠 *完毕日期:2015.6.02 *版本:v1.0 * *问题描写叙述:写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形).Rectangle(矩形).Triangle(三角形).用例如以下的main()函数,求出定义的几个几何体的面积和. *输入描写叙述: *程序输出: #include <iostr

第13课 类族结构的进化

1. 遵循经典设计准则 (1)DTLib中所有类位于单一的继承树 (2)改进的关键点 ①Exception类继承自Object类:堆空间中创建异常对象失败时,返回NULL指针. ②新增InvalidOperationException类:成员函数调用时,如果状态不正确则抛出异常. ③SmartPointer类继承自Object类:堆空间中创建智能指针对象失败时,返回NULL指针. 2. DTLib的开发方式和注意事项 (1)迭代开发:每次完成一个小的目标,持续开发,最终打造可复用类库 (2)单一

第十三周(立体类族共同拥有的抽象类)

/* *copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名:第十三周(立体类族共同拥有的抽象类) *作者:王忠 *完毕日期:2015.6.02 *版本:v1.0 * *问题描写叙述:设计一个抽象类CSolid.含实用于求表面积及体积的两个纯虚函数.设计派生类CCube.CBall.CCylinder.分别表示正方体.球体及圆柱体. 在main()函数中,定义CSolid *p;(p是指向基类的指针,且这个基类是个抽象类). 要求利用这个p

C# 类的规范写法

私有变量写在最上面,简单变量在上,复杂类型在下,以下划线_开头 类的常量紧随其后 不提供公共变量,所有变量以属性的方式对外开放 变量之后是属性 属性之后是方法,构造方法在最上方 公共方法随其后 最后是私有方法 例子: 1 public class SimpleClass 2 { 3 private int _num; 4 private string _word; 5 private static readonly TimeZone _timeZone; 6 private const doub

第14周项目4-立体类族共有的抽象类

/* *Corpyright (c)2013,烟台大学计算机学院 *All right reseved. *作者:张凯 *完成日期:2014年5月28日 *版本号:v1.0 *输入描述: *问题描述: *程序输出: *问题分析: *算法设计: */ #include<iostream> #include<cstring> using namespace std; class CSolid { public: virtual double area()=0; virtual doub

14周 项目3 立体类族共有的抽象类

#include <iostream> using namespace std; class CSolid { public: virtual double area() const=0; virtual double volume() const=0; }; class CCube:public CSolid { public: CCube(double s):side(s) {} virtual double area()const { return 6*side*side; } virt