2012-08-07 101 views
2

我有一个名为“BaseEntry”的类和一些特定的类,如“EntryFoo”和“EntryBar”,它们是“Base Entry”的子类。iOS:方法返回类型应该是X类的子类

现在有一个函数getEntry,它应该返回一个Object,它是BaseEntry的子类。在Java中这不会是一个问题,但我不知道如何解决这个Objective-C的iOS。

感谢您的帮助! 亚历克斯

+0

你想编写一些代码,编译器不会让你?或者你是否想对自己执行一些编译时类型检查? – Thilo 2012-08-07 08:08:50

+0

' - (BaseEntry *)getEntry;'不起作用? – Thilo 2012-08-07 08:10:03

+0

是 - (BaseEntry *)getEntry;可以工作,但该方法应该返回EntryFoo或EntryBar,因为在这个类中需要特定的变量和函数。 – 2012-08-07 08:19:13

回答

3

在Objective-C中做到这一点的标准方法是返回一个'id'类型的对象。在Java中将其视为Object。但是,id稍好一点,因为您可以将返回值分配给类型化的值,而无需强制转换。

为了澄清,你的选择是:

// Assuming -(BaseEntry*)getEntry; 
id entry = [obj getEntry]; 
[entry messageOnlyOnFooEntry]; 

// Assuming -(BaseEntry*)getEntry; - note cast required 
FooEntry *entry = (FooEntry*)[obj getEntry]; 
[entry messageOnlyOnFooEntry]; 

// Assuming -(id)getEntry; - no cast required 
FooEntry *entry = [obj getEntry]; 
[entry messageOnlyOnFooEntry]; 
+1

这是正确的,在目标C中不支持协变返回类型,它们在Java中几乎不受支持。它们不是在OOP中利用的设计模式。返回id并根据您的需要投射指针。 – 2012-08-09 09:25:31

0
BaseEntry gE = [[BaseEntry alloc] init]; // Allocate and init a BaseEntry object 
returnGetEntryHere = [ge getEntry]; // This will execute getEntry which is a method in BaseEntry 

你有没有尝试过直到现在呢?如果你发布了一些代码,也许人们可以帮助你解决你对Objective-C项目的误解和缺点

相关问题