`

模拟静态变量及静态类继承

 
阅读更多

模拟静态变量及静态类继承

转自:http://www.cnblogs.com/chenjunbiao/archive/2011/05/03/2034998.html

在Objective-C中是没有静态类变量一说的,不过我们可以模拟出来,但如果类对象之间还有继承关系,这样就一点复杂的了。我们这里假设一个Coupon类对象需要保存当前还剩多少有优惠券,还有一个继承于Coupon类对象的NewCoupon类对象,但它也保存有自已可用的优惠券的数量,我们如何保证他们的静态类变量相互独立,请看下面的例子。

Coupon.h

#import <Foundation/Foundation.h>

@interface Coupon : NSObject {

}

+(int) numberCouponsLeft;
+(void) resetCoupon;

@end

Coupon.m

#import "Coupon.h"
#define INITIAL_COUPON_ALLOCATION 100

//设置静态变量
static int availableCoupons = INITIAL_COUPON_ALLOCATION;

//在实现类中定义私有静态访问器
@interface Coupon()
+(int) availableCoupons;
+(void) setAvailableCoupons:(int) inAvailableCoupons;
@end

@implementation Coupon

+(int) availableCoupons
{
return availableCoupons;
}

+(void)setAvailableCoupons:(int)inAvailableCoupons
{
availableCoupons
= inAvailableCoupons;
}

//为了支持静态类的继承,重点看init
-(id) init
{
if((self = [super init]))
{
//[self class] 表示用作接收者的那个对象,如果是继承类,指的是该继承类对象。
if([[self class] availableCoupons] == 0)
{
//如果有效的Coupon为0,则消毁该类对象
[self release];
return nil;
}

//当前有效的Coupon减1
[[self class] setAvailableCoupons: [[self class] availableCoupons]-1];
}
return self;
}

+(int) numberCouponsLeft
{
return [self availableCoupons];
}

+(void) resetCoupon
{
[self setAvailableCoupons:INITIAL_COUPON_ALLOCATION];
}

@end

NewCoupon.h

 

#import <Foundation/Foundation.h>
#import
"Coupon.h"


@interface NewCoupon : Coupon {

}

@end

NewCoupon.m

 

#import "NewCoupon.h"
#define INITIAL_New_COUPON_ALLOCATION 200

//在继承类中设置新的静态变量
static int availableCoupons = INITIAL_New_COUPON_ALLOCATION;

@interface NewCoupon()
+(int)availableCoupons;
+(void) setAvailableCoupons: (int)inAvailableCoupons;
@end

@implementation NewCoupon

+(int)availableCoupons
{
return availableCoupons;
}

+(void) setAvailableCoupons:(int)inAvailableCoupons
{
availableCoupons
= inAvailableCoupons;
}

+(void) resetCoupon
{
[self setAvailableCoupons:INITIAL_New_COUPON_ALLOCATION];
}

@end

main.m

 

#import <Foundation/Foundation.h>
#import
"Coupon.h"
#import
"NewCoupon.h"

int main (int argc, const char * argv[])
{

NSAutoreleasePool
* pool = [[NSAutoreleasePool alloc] init];

// insert code here...
//NSLog(@"Hello, World!");

[[Coupon alloc] init];
NSLog(
@"%d", [Coupon numberCouponsLeft]);
[Coupon resetCoupon];
NSLog(
@"%d", [Coupon numberCouponsLeft]);

[[NewCoupon alloc] init];
NSLog(
@"%d", [NewCoupon numberCouponsLeft]);
[NewCoupon resetCoupon];
NSLog(
@"%d", [NewCoupon numberCouponsLeft]);

[pool drain];
return 0;
}

 

返回结果:

 

[Switching to process 3200 thread 0x0]
2011-05-03 10:15:08.505 demo04[3200:903] 99
2011-05-03 10:15:08.508 demo04[3200:903] 100
2011-05-03 10:15:08.508 demo04[3200:903] 199
2011-05-03 10:15:08.509 demo04[3200:903] 200

分享到:
评论

相关推荐

    11.5_ 接口与继承的实例,VS2008源代码

    2. **多重继承**:虽然C#不支持类的多重继承,但它允许一个类实现多个接口,这里可能会展示如何利用接口模拟多重继承的效果。 3. **接口实现**:展示了如何定义接口并由类实现这些接口,以及如何在代码中调用接口...

    java基础类与继承.ppt

    静态变量被所有类的对象共享,而静态方法可以直接通过类名调用,无需创建对象。 - **final**:`final`关键字用于声明不可变的变量或方法。一旦变量被声明为`final`,其值就不能更改。对于方法,如果声明为`final`,...

    c++书店模拟 addressBookType

    例如,可以有一个`SpecialOffer`类继承自`Transaction`,以处理特别的促销活动。多态则使得不同类型的对象可以对同一种消息做出不同的响应,例如,所有类型的交易都可以被打印或计算总价。 5. **容器与迭代器**: ...

    浅谈js继承的实现及公有、私有、静态方法的书写

    本文将深入探讨JavaScript中的继承实现方式以及公有、私有和静态方法的概念。 首先,我们要理解JavaScript中的对象和原型。JavaScript使用原型(prototype)机制来实现继承,这意味着一个对象可以访问其原型对象的...

    继承Thread类构造多线程实例

    - **线程**是程序中的执行单元,每个线程都有自己的程序计数器、系统栈、局部变量等资源,它们共享同一块内存区域,即堆内存和静态变量。多线程可以使得程序在同一时刻执行多个任务,提高系统的并发性。 - **Java...

    JAVA模拟面试题库.docx

    - 抽象类的静态变量可以有任意访问修饰符,接口的静态变量只能是`public static final`。 7. **数据类型表示价格**:在Java中,对于价格这种需要精确计算的场景,通常推荐使用`BigDecimal`类,因为它可以避免...

    java模拟题库面试题目64道经典答题及答案

    静态变量属于类,只有一个副本,由类的所有对象共享。 - **生命周期**:实例变量随对象创建而存在,随对象消失而消失。静态变量随类加载而存在,随类卸载而消失。 - **内存位置**:实例变量存储在堆内存中,静态变量...

    基于PHP静态类的原罪详解

    静态类是PHP中的一种特殊类,它们的成员变量和方法可以通过类名直接调用,而不需要创建类的实例。在PHP中,通常使用关键字`static`来声明静态属性和方法。使用静态类的场景包括但不限于创建工具类,这类工具类常用于...

    C模拟C++程序

    4. **模拟静态成员和静态函数**:C++的静态成员是属于类的,而非类的实例。在C中,我们可以使用全局变量或外部函数来实现相同的功能: ```c int globalCount = 0; void incrementCount() { globalCount++; } ``` ...

    Java的静态方法调用.pdf

    1. **无法访问实例变量**:静态方法不能访问或修改类的实例变量,因为它们不与特定的对象实例关联。 2. **不利于封装**:由于静态方法与类关联,而非对象,它们可能会导致过度耦合,违反面向对象的封装原则。 3. *...

    java内部类

    由于Java不支持多继承,但每个内部类都可以独立地继承一个类或实现一个接口,这使得我们可以同时模拟多个父类的功能。内部类的这一特性与接口结合使用,可以提供一种类似于C++中的多重继承机制。 在创建和使用内部...

    JAVA 实现ATM模拟系统

    9. **静态变量与静态块**:`bankName`和`allNum`是静态变量,意味着它们属于类而不是对象,所有用户共享同一份数据。`static`块在类加载时执行,用于打印欢迎信息。 这个ATM模拟系统展示了Java语言在构建面向对象...

    精品资料(2021-2022年收藏)面向对象技术Java期末复习试卷四.docx

    1. 静态变量:静态变量是类级别的变量,它被所有类的实例共享。这意味着无论创建了多少个类的实例,它们都将共用同一份静态变量的副本。选项B正确描述了这一点,表示静态变量在方法中创建后,会在多次调用之间保留其...

    08丨理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?1

    接口中不能有实例变量,但可以有静态变量。 3. **访问修饰符**:接口的方法默认是公开的(`public`),而抽象类中的方法可以有不同的访问级别。 4. **构造函数**:抽象类可以有构造函数,而接口不能。 5. **实现...

    C++面向对象程序设计模拟试题一.pdf

    本资源摘要信息涵盖了C++面向对象程序设计的多个方面,包括虚函数、继承、多态性、类模板、运算符重载、静态成员变量、 Copy构造函数等重要概念。 1. 虚函数(Virtual Function):虚函数是C++中的一种特殊函数,...

    Junit测试 简单用例

    4. 集成测试:Junit可以与其他工具(如Mockito、PowerMock)结合,进行模拟对象和静态方法的测试,以及数据库和网络连接的集成测试。 5. 测试监听器:`TestWatcher`等监听器可以自定义测试执行过程中的行为,如记录...

    Javascript 类与静态类的实现(续)

    此外,静态类的使用可以避免全局变量的污染,因为所有的静态成员都封装在一个闭包内。这有助于提升代码的可维护性和安全性,尤其是在大型项目中。 总结来说,JavaScript中的静态类是通过闭包和对象引用实现的,提供...

    C++模拟题5.pdf

    这篇C++模拟试题主要涵盖了C++语言的基础概念和核心特性,包括类、对象、构造函数、析构函数、成员函数、静态成员、友元函数、继承、多态、运算符重载、函数模板等关键知识点。以下是这些知识点的详细解释: 1. **...

    JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    在本文中,我们将深入探讨JavaScript中的一些关键面向对象的概念,包括`Object类`、`静态属性`、`闭包`、`私有属性`以及`call`和`apply`方法的使用,同时还会介绍三种实现继承的方法。 首先,`Object类`是...

Global site tag (gtag.js) - Google Analytics