【问题标题】:Simulate abstract classes and abstract methods in Objective C? [duplicate]在Objective C中模拟抽象类和抽象方法? [复制]
【发布时间】:2012-06-28 15:36:57
【问题描述】:

可能重复:
Creating an abstract class in Objective C

在 Java 中,我喜欢使用抽象类来确保一堆类具有相同的基本行为,例如:

public abstract class A
{
// this method is seen from outside and will be called by the user
final public void doSomething()
{
// ... here do some logic which is obligatory, e.g. clean up something so that
// the inheriting classes did not have to bother with it

reallyDoIt();
}
// here the actual work is done
protected abstract void reallyDoIt();

}

现在如果类 B 继承自类 A,它只需要实现 reallyDoIt()

如何在 Objective C 中做到这一点?有可能吗?在Objective C中可行吗?我的意思是整个范式在 Objective C 中似乎是不同的,例如据我了解,没有办法禁止覆盖方法(例如在 Java 中使用“final”)?

谢谢!

【问题讨论】:

标签: objective-c class methods virtual abstract


【解决方案1】:

对于不覆盖目标 c 中的方法没有实际限制。您可以使用 Dan Lister 在他的回答中建议的协议,但这仅有助于强制您的符合类实现该协议中声明的特定行为。

目标 c 中抽象类的解决方案可能是:

interface MyClass {

}

- (id) init;

- (id) init {
   [NSException raise:@"Invoked abstract method" format:@"Invoked abstract method"]; 
   return nil;
}

通过这种方式,您可以防止调用抽象类中的方法(但只能在运行时调用,不像 java 这样的语言可以在编译时检测到这一点)。

【讨论】:

  • 谢谢,这实际上是我想做的。我只是希望有一些方法可以在编译时告诉实现继承类的程序员一个方法丢失而不是运行时。
  • 这不会让整个if (self = [super init]) {...} return self; 在子类上崩溃吗?
【解决方案2】:

我想你会想使用一个叫做Protocols的东西。

【讨论】:

  • +1 你可能会补充说,Objective-C 是一种更依赖于约定而不是执行规则的语言。作为开发人员,您必须遵守这些约定才能使事情顺利进行。
  • 协议 [几乎] 等同于 Java 中的接口。所以这并不是 OP 真正想要的。
  • 我认为抽象类和协议并不完全相同。考虑: Animal *duck = [Duck new];协议不能像这样的超类型工作。这种构造可以允许动态地将子类作为参数。
  • 如果您有(例如)插件架构并且想要共享 一些 代码并希望子类覆盖其中一些方法,则抽象类很有用。在此处阅读更多信息developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
猜你喜欢
  • 2016-03-17
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
相关资源
最近更新 更多