【问题标题】:Method Overriding in Objective-CObjective-C 中的方法覆盖
【发布时间】:2011-10-29 04:17:05
【问题描述】:

我是一名开始为 iPhone 制作应用程序的 Java 程序员。我偶然发现了一个问题。假设以下代码(在 java 中):

1 级(建筑)

public abstract class Building
{
    public void Update()
    {
        specialAction();
    }

    public abstract void specialAction();
}

2 级(房子)

public abstract class House extends Building
{   
    public abstract void specialAction()
    {
        System.out.println("Special Action Done");
    }
}

可运行类

public class Program
{   
    public void main(String[] args)
    {
        House h = new House();
        h.Update();
    }
}

当在Program 中调用来自House hUpdate 方法(从超类Building 运行)时,来自House 的方法specialAction 被调用,因此控制台打印“特殊操作完成”。我的问题是,xcode 中的以下代码是否等效(在继承和方法覆盖方面,而不是控制台输出方面):

1 级(建筑): .h 文件:

-(void)Update;
-(void)SpecialAction;

.m 文件:

-(void)Update
{
    [self specialAction];
}

Class 2(House,继承自Building): .m 文件:

-(void)SpecialAction
{
    NSLog("Special Action Done");
}

可运行类

House* h = [[House alloc] init];
[h Update];

【问题讨论】:

  • 发生了什么,当你尝试的时候?

标签: java objective-c inheritance


【解决方案1】:

您的示例看起来正确。您的 Java 示例的完整程序在 ObjC 中近似如下:

/* Building.h */
@interface Building : NSObject
- (void)Update;
- (void)specialAction;
@end

/* Building.m */
@implementation Building

- (void)Update
{
    [self specialAction];
}

- (void)specialAction
{
    assert(0 && "override required"); // << see note
}

@end

/* House.h */
@interface House : Building
@end

/* House.m */
@implementation House

- (void)specialAction
{
    NSLog(@"Special Action Done");
}

@end

void ProgramMain()
{
    House * h = [House new];
    [h Update];
    [h release];
}

语言中没有内置正式的抽象方法,但您可以使用协议对其进行近似。

您可以认为所有 ObjC 方法都是虚拟的。

【讨论】:

  • 在抽象类中创建方法的“标准”方式是发送doesNotRecognizeSelector消息,即[self doesNotRecognizeSelector:_cmd];
  • @sebnow 我不认为任何一个“标准”。这真的只是一个插图。一个实现可能有多种形式。
【解决方案2】:

House 是否继承自 Building

@interface House : Building

如果是这样,您不必在此处使用不同的名称执行您的特殊操作。 你可以声明

-(void)Update;

在House.h

并在 House.m 中将其定义为

-(void)Update
{
    NSLog("Special Action Done");
}

House 对象上调用Update 方法将调用House.m 中的定义

附:由于您是 iOS 新手,我想提一下约定:诸如“House”之类的类名以大写字母开头;方法名和变量名以小写字母开头。

【讨论】:

  • 抱歉没有解释,但在 java 和 Objective-C 示例中,类 House 扩展了 Building
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多