Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 魔术师与定制类–;理解头文件和实现文件_Objective C_Oop - Fatal编程技术网

Objective c 魔术师与定制类–;理解头文件和实现文件

Objective c 魔术师与定制类–;理解头文件和实现文件,objective-c,oop,Objective C,Oop,我在Objective-C世界中迈出了第一步,同时还写了一本关于这个主题的书。我现在已经到了将创建和使用自定义类的概念内化的阶段 我想正确理解这些基本概念和原则是我未来学习Objective-C的关键,我只是想和你们确认一下,我是否正确地掌握了这些概念 因此,在创建自定义类时,我知道这是在两个单独的文件中完成的——公共类头文件和类实现文件。为了将这一概念内化,我将其比喻为“魔术师”在观众面前表演魔术 头文件有点像剧院外魔术师表演的海报。在进入之前,我们都可以看到魔术师长什么样(属性),他(主要是

我在Objective-C世界中迈出了第一步,同时还写了一本关于这个主题的书。我现在已经到了将创建和使用自定义类的概念内化的阶段

我想正确理解这些基本概念和原则是我未来学习Objective-C的关键,我只是想和你们确认一下,我是否正确地掌握了这些概念

因此,在创建自定义类时,我知道这是在两个单独的文件中完成的——公共类头文件和类实现文件。为了将这一概念内化,我将其比喻为“魔术师”在观众面前表演魔术

头文件有点像剧院外魔术师表演的海报。在进入之前,我们都可以看到魔术师长什么样(属性),他(主要是“他”)能表演什么把戏(方法),以及他能表演什么类型的魔术(类型声明)。因此,从这个魔术师的“公开”海报(头文件),我可以了解他能表演什么样的魔术,他在使用什么道具。也许还有一点值得一提的是,这位特殊的魔术师从伟大的霍迪尼那里学到了一些技巧(霍迪尼是一个阶级遗产,因此霍迪尼是一个超阶级)

如果我被允许在后台,我将能够真正看到他是如何做他的把戏的,也就是说,我将能够在魔术师实现文件中查看

这个比喻是否与您如何理解自定义类的概念有些相似

然而,我还没有完全弄清楚类方法和实例方法的概念是如何与这个隐喻联系在一起的

你能说实例方法属于魔术师的这个“实例”在这个节目中表演的一类把戏吗?类方法是当代魔术师可以表演的把戏? 第三,方法使用“类型”的方式有点混乱。有些似乎是在接口文件中预先声明的,有些似乎只是在方法中动态地“声明”的

以使用“魔术师”类为例,我对头文件的理解可能如下所示:

@interface Magician : NSHoudini

// Instance method that given a variable of type rat it will turn this into something of type rabit 

-   (rabit) FromRatToRabit: (rat) aRat;

@end 
#import “Magician.h”

@implementation Magician

rabit aRabit 
// rabit being the type and aRabit the variable


-   (rabit) FromRatToRabit:(rat)aRat;
{

// some magic code goes here which will take what’s in the aRat variable, of type rat
// and turn it into a form of type rabit and return it in the aRabit variable 

aRabit
}
@end
实现文件可能如下所示:

@interface Magician : NSHoudini

// Instance method that given a variable of type rat it will turn this into something of type rabit 

-   (rabit) FromRatToRabit: (rat) aRat;

@end 
#import “Magician.h”

@implementation Magician

rabit aRabit 
// rabit being the type and aRabit the variable


-   (rabit) FromRatToRabit:(rat)aRat;
{

// some magic code goes here which will take what’s in the aRat variable, of type rat
// and turn it into a form of type rabit and return it in the aRabit variable 

aRabit
}
@end

如果上面所说的是正确的,我想知道为什么没有声明为方法“提供”的aRat变量?或者,当您在方法描述中使用该声明时,是否认为该声明已完成?

这是理解公共接口和隐藏实现之间区别的一个很好的隐喻。但是我想你可能有点被它迷住了,我确实看到了两个主要的误解——“Houdini”是超类,而类方法是“所有技巧”

评估继承层次结构的敏感性的常用教科书方法是评估子类实例是否是超类实例。这在现实中可能会变得非常抽象,但如果你在设计魔术师公会医疗保险福利处理软件或其他东西,在这种情况下,魔术师“是”绝对不是胡迪尼!假设他们都是自由职业者,所以每个魔术师“都是”1099承包商(美国自营职业收入纳税表),或者类似的东西。另一种思考的方式是认为魔术师“是”舞台演员,“是”艺人,等等。并不是说你总是想做这样的软件,但我想它可以帮助你学习这个概念

你说的第二件事是如何思考类方法。考虑类方法的行为和类型固有的信息,并且独立于任何实例。回到福利软件的例子,让我们假设所有魔术师公会成员都能得到401k(另一个美国税法的东西,退休帐户),每个工资支票有X美元的固定缴款。现在假设这不是随资历而变化的东西,这将是一个很好的信息,可以保存在班级级别。所以,魔术师可以执行的所有技巧都不是类方法——魔术师执行它们,所以它们是实例方法。也许一个被禁止的技巧列表(因为太危险)可以是一个类方法——这是魔术师固有的规则,但独立于任何一个魔术师

最后,关于你关于类型的第三个问题,我可以猜出你在问什么,但我不确定。说你有办法

- (void)myMethod:(id)myArgument
{
    NSLog(@"myArgument = %@",myArgument);
}
那么您是在问
myArgument
声明在哪里?它就在方法签名中声明,在方法签名中它是方法的一个参数,您可以在方法体的范围内(在花括号内)引用它。我不确定这是否就是你所说的“在飞”的意思。恐怕您必须提供一些实际的源代码,而不是伪代码,并指出您想知道的具体位置

还有一些术语上的小点,很抱歉,这太长了-将值“馈送”给方法的术语是“传递”,通常作为“参数”或“参数”。方法“描述”通常称为方法签名或声明,有时我听说是原型。是的,请澄清你所说的类型、类型声明等等,我对你的问题不是100%清楚


希望这有帮助

你的比喻是可以接受的。头是其他文件查看的接口,告诉他们可以从该类/文件及其相应的实现文件(如果有)访问什么

我注意到在你的代码中,魔术师是Houdini的一个子类。我可能只是误解了你的例子,但就继承而言,这可能是错误的。你在说什么
Houdini *myHoudini = [[Houdini alloc] init];
Rat *houdinisRat = [[Rat alloc] init];
Rabbit *houdinisRabbit = [myHoudini fromRatToRabbit:houdinisRat];