接上文
继承是面向对象的一个核心概念。在Objective-C的继承体系中,位于最顶层的根类是NSObject,类比Java中的java.lang.Object类,我们定义的所有类都是它的子类。子类也叫扩展类或派生类。
我们之前使用的分数类Fraction就是NSObject类的派生类。继承使得子类可以从父类中获得一些属性和已有方法。要注意的是如果子类中要直接使用父类继承过来的实例变量,那么必须将变量声明在接口部分中,而在实现部分声明的变量,子类无法继承使用。在实现部分声明和synthesize的实例变量都是私有的,子类不能直接访问,需要提供设置值和取值方法才可以访问这些变量。
看下面这个例子,我们来具体看看继承的实现:
#import <Foundation/Foundation.h>
@interface ClassA:NSObject
{
int n;
}
-(void) initVar;
@end
@implementation ClassA
-(void) initVar
{
n=406;
}
@end
@interface ClassB:ClassA
-(void) printVar;
@end
@implementation ClassB
-(void) printVar
{
NSLog(@"n=%i",n);
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool{
ClassB *clsB=[ClassB new];
[clsB initVar];
[clsB printVar];
}
return 0;
}
编译运行后,我们得到如下结果:
下面来解释这个程序,该程序中我们定义了两个类ClassA和ClassB,ClassA的父类是NSObject,这是Objective-C中的根类,ClassB继承自ClassA,那么ClassB也间接继承了NSObject类。定义ClassA的接口时,我们定义了一个变量n,那么子类ClassB才能访问到它,ClassA中定义了方法initVar,而ClassB中定义了方法printVar。在执行主函数时,首先创建了ClassB对象,使用initVar来初始化参数,initVar是ClassA中的方法,此时使用ClassB类的引用指针来调用就体现了继承的观点。然后再执行printVar方法,我们就看到了结果。
这里我们使用new来创建对象,是我们用它来代替alloc和init方法,这两个方法我们没有定义却直接使用了,说明它是从根类NSObject中继承而来的。之前代码中的示例也一直使用到了继承。
我们将代码修改如下:
#import <Foundation/Foundation.h>
@interface ClassA:NSObject
{
int n;
}
-(void) initVar;
-(void) setVar:(int) m;
-(void) print;
@end
@implementation ClassA
-(void) initVar
{
n=406;
}
-(void) setVar:(int) m
{
n=m;
}
-(void) print
{
NSLog(@"n=%i",n);
}
@end
@interface ClassB:ClassA
-(void) printVar;
@end
@implementation ClassB
-(void) printVar
{
NSLog(@"n=%i",n);
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool{
ClassA *clsA=[[ClassA alloc] init];
ClassB *clsB=[ClassB new];
[clsB initVar];
[clsB printVar];
[clsA setVar:10];
[clsA print];
[clsB printVar];
}
return 0;
}
再次编译运行,我们得到如下输出:
这里我们在主函数中创建了对象ClassA,并且为A提供了设置值和打印方法。那么程序中间我们重新设置了ClassA的属性n,然后再打印值来看。那么这个结果告诉我们一个事实:类的每个实例都有自己的实例变量,即便这些变量是继承来的,那么对于父类中的变量修改,子类中的值无影响。ClassB和ClassA拥有完全不同的实例变量。
下面我们继续来深入理解继承,首先设计一个矩形类Rectangle,代码如下:
#import <Foundation/Foundation.h>
@interface Rectangle : NSObject
@property int width,height;
-(int) area;
-(int) perimeter;
-(void) setWidth:(int) w andHeight:(int) h;
@end
实现文件如下:
#import "Rectangle.h"
@implementation Rectangle
@synthesize width, height;
-(int) area
{
return width*height;
}
-(int) perimeter
{
return (width+height)*2;
}
-(void) setWidth:(int)w andHeight:(int)h
{
width=w;
height=h;
}
@end
主函数如下:
#import "Rectangle.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Rectangle *rect=[Rectangle new];
[rect setWidth:10 andHeight:23];
NSLog(@"Rectangle: width=%i, height=%i",rect.width,rect.height);
NSLog(@"Area = %i, Perimeter = %i",rect.area,rect.perimeter);
}
return 0;
}
编译运行,得到如下结果:
这个矩形类的定义很简单,定义了长和宽两个变量,定义了设置长和宽的方法,求面积方法和求周长方法。直接运行即可得到结果并不复杂。如果我们需要一个正方形类,该如何设计呢?正方形是矩形的一个特殊情况,就是长宽相等,那么可以将正方形类视作矩形类的子类,那么我们创建这个类,并编写如下代码:
#import "Rectangle.h"
@interface Square : Rectangle
-(void) setSide:(int) s;
-(int) side;
@end
编写正方形类Square的实现:
#import "Square.h"
@implementation Square
-(void) setSide:(int)s
{
[self setWidth:s andHeight:s];
}
-(int) side
{
return self.width;
}
@end
编写测试的主函数:
#import "Square.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Square *square = [Square new];
[square setSide:10];
NSLog(@"Square: s=%i",[square side]);
NSLog(@"Area = %i, Perimeter = %i",square.area,square.perimeter);
}
return 0;
}
编译运行,我们得到如下结果:
这里我们定义的Square类继承了Rectangle类,并定义了setSide和side方法用于设置边长和返回边长,那么在实现方法中。setSide方法使用了self关键字调用了父类的setWidth addHeight方法,这也是继承的体现。那么side 方法返回边长即可,注意这里的self.width其实是[self width],父类中我们使用了@synthesize指令,那么对私有属性width就提供了访问方法,而方法名和属性名同名,但是要清楚这里我们是调用的方法而不是属性,这点理解是很重要的。
接下文
- 大小: 33.4 KB
- 大小: 49.9 KB
- 大小: 66.2 KB
- 大小: 63 KB
分享到:
相关推荐
1. **Objective-C是C的超集**:Objective-C在C语言的基础上增加了面向对象的特性,如类、继承、多态等。它允许程序员通过消息传递来调用对象的方法,而不是像C那样直接调用函数。 2. **消息传递**:在Objective-C中...
这篇“Objective-C学习笔记”旨在帮助初学者理解并掌握这种强大的编程工具。 一、Objective-C基础 1. 类与对象:Objective-C中的所有操作都是基于类的,类是对象的模板,而对象是类的实例。理解类和对象的概念是...
根据给定的学习笔记,我们将从以下几个方面深入探讨Objective-C的基础语法: 1. **基本概念介绍**:包括类、对象、方法等基本概念。 2. **Objective-C核心类型**:如`NSString`、`NSArray`、`NSDictionary`。 3. **...
Objective-C 是一种面向对象的编程语言,起源于20世纪80年代,由Bard Cox发明,后来在NeXTSTEP操作系统中得到广泛应用。NeXT公司由Steve Jobs创立,并在1996年被苹果公司收购,Objective-C也随之成为苹果操作系统的...
这份“Objective-C学习资料”包含了内置的学习笔记和各内容源码,是作者在近两个月的学习过程中整理出来的成果,旨在为初学者提供有价值的指导。 首先,让我们深入了解一下Objective-C的基本概念。Objective-C是在...
Objective-C是一种基于C语言的面向对象编程语言,主要应用于Apple的macOS和iOS操作系统。它是开发Mac应用程序的基础,对于想要进入苹果平台开发的程序员来说,学习Objective-C是必不可少的步骤。本资源包为初学者...
**Objective-C**是一种面向对象的编程语言,它在C语言的基础上增加了面向对象的功能,并且是开发iOS应用的主要语言之一。尽管Swift已经成为苹果官方推荐的新一代编程语言,但Objective-C仍然拥有大量的代码库和丰富...
Objective-C(简称Obj-C或Objective C)是苹果公司基于C语言开发的一种面向对象编程语言,主要用于iOS和macOS平台的应用程序开发。它在C语言的基础上添加了Smalltalk风格的消息传递机制,使得面向对象编程更加灵活...
Objective-C是在C语言的基础上扩展的,增加了Smalltalk式的面向对象特性,使得它在编写复杂应用程序时具有更高的灵活性和可扩展性。 Objective-C的核心概念主要包括类、对象、消息传递和协议。以下是对这些概念的...
Objective-C是一种强大的面向对象编程语言,它是Apple的iOS和macOS操作系统的核心开发语言。这篇总结将深入探讨Objective-C的关键概念,以及如何在实际项目中应用它们。 首先,我们需要理解Objective-C的基本语法。...
- **类继承**:Objective-C 支持继承,使用冒号 `:` 表示子类继承自哪个父类,如 `Fraction: NSObject` 表示 `Fraction` 类继承自 `NSObject` 类。 - **类变量与成员变量**:类变量(如 `t`)是属于类的,所有实例...
Objective-C 是苹果平台下开发 iOS 和 macOS 应用的主要编程语言之一,虽然 Swift 已经成为新宠,但Objective-C 的重要性仍然不可忽视,尤其是因为许多现有的类库和框架仍由 Objective-C 编写。以下是一份关于...
《Objective-C语言教程0220.zip》是一个包含Objective-C编程基础及实例的课程资源包。这个压缩包中,我们能够找到一系列与学习Objective-C语言相关的材料,包括图像和文本文件,旨在帮助初学者理解并掌握这门强大的...
3. **协议(Protocols)**:Objective-C 的协议类似于Java或C#的接口,定义了一组必须被遵循的方法,但不强制实现,这在多继承不可用的情况下提供了一种解决方案。 4. **动态类型(Dynamic Typing)**:Objective-C...
Objective-C(简称Obj-C或Objective-C)是苹果公司基于C语言构建的一种面向对象的编程语言,广泛应用于iOS和Mac OS X操作系统。本教程将深入探讨Object-C的基础概念、语法特性以及实际开发中的应用,旨在帮助初学者...
在Swift中,我们看到一个简单的`Act`类示例,它继承自`NSObject`以便于与Objective-C代码交互。`Act`类有一个`hasAct`方法,使用了Swift的`switch`语句来根据传入的整数标签返回不同的字符串结果。此外,类还包含了...
在本资源包中,我们提供了Object-C的基础介绍以及相关的示例Demo源码,旨在帮助初学者更好地理解和学习这一强大的编程工具。 Objective-C的语法基础: 1. **消息传递**:Objective-C中的对象通过消息传递进行通信,...
Objective-C(简称OC)是苹果公司为iOS和Mac OS X操作系统开发的一种面向对象的编程语言。它是C语言的超集,融入了Smalltalk的特性,使得它在编程时具有高度的灵活性和强大的表达能力。本笔记合集将深入探讨OC的基础...
根据提供的文件信息,我们可以整理出一系列关于Objective-C的基础知识点,主要涵盖了语法结构、变量类型、内存管理、类与对象操作等方面。以下是对这些知识点的详细解释: ### 1. 类的基本结构 - **声明...