我有一个名为“BaseEntry”的类和一些特定的类,如“EntryFoo”和“EntryBar”,它们是“Base Entry”的子类。iOS:方法返回类型应该是X类的子类
现在有一个函数getEntry,它应该返回一个Object,它是BaseEntry的子类。在Java中这不会是一个问题,但我不知道如何解决这个Objective-C的iOS。
感谢您的帮助! 亚历克斯
我有一个名为“BaseEntry”的类和一些特定的类,如“EntryFoo”和“EntryBar”,它们是“Base Entry”的子类。iOS:方法返回类型应该是X类的子类
现在有一个函数getEntry,它应该返回一个Object,它是BaseEntry的子类。在Java中这不会是一个问题,但我不知道如何解决这个Objective-C的iOS。
感谢您的帮助! 亚历克斯
在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];
这是正确的,在目标C中不支持协变返回类型,它们在Java中几乎不受支持。它们不是在OOP中利用的设计模式。返回id并根据您的需要投射指针。 – 2012-08-09 09:25:31
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项目的误解和缺点
你想编写一些代码,编译器不会让你?或者你是否想对自己执行一些编译时类型检查? – Thilo 2012-08-07 08:08:50
' - (BaseEntry *)getEntry;'不起作用? – Thilo 2012-08-07 08:10:03
是 - (BaseEntry *)getEntry;可以工作,但该方法应该返回EntryFoo或EntryBar,因为在这个类中需要特定的变量和函数。 – 2012-08-07 08:19:13