代码之家  ›  专栏  ›  技术社区  ›  alexantd

重写Objective-C中的继承类型

  •  1
  • alexantd  · 技术社区  · 14 年前

    抽象模型

    @interface AbstractModel {
    }
    

    模型实现

    @interface ModelImpl : AbstractModel {
    }
    

    控制器

    @interface ControllerA {
        AbstractModel *foo;
    }
    
    @property (nonatomic, retain) AbstractModel *foo;
    

    控制器B

    @interface ControllerB : ControllerA {
    }
    

    我想说的是 foo 在ControllerA中,可以包含抽象模型或其任何子类型。但是,如果我试图在其中存储抽象模型以外的任何内容,编译器会给出警告(我当然明白上课不能 真正地 在ObjC中要抽象,但请宽恕我。)

    我也希望能够“锁定”的 特定子类中的属性。我想说的是 例如,在ControllerB中只能包含ModelImpl4。这可能吗?

    解决这类问题的传统Objective-C最佳实践是什么?在Objective-C中,以这种方式使用继承——或者为了实现这个目标——不是一个好主意吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Rob Napier    14 年前

    首先,我想了解:

    但是,编译器给了我一个 警告如果我试图存储任何东西 而不是抽象模型。

    这没有道理。您应该能够分配 AbstractModel foo 没有麻烦。你看到什么问题了?

    • 首先,你可以摆脱 -foo 在里面 ControllerA 控制器 实际上是抽象的,那么最好不要抽象。如果 控制器 是抽象的,我绝对建议你去掉

    • 或者,可以向子类添加类型化方法。例如, ControllerB 会有一个 -modelBFoo -福

        2
  •  1
  •   jhleath    14 年前

    对。解决第一个问题最简单的方法就是忽略编译器警告。它将在运行时工作。如果你不喜欢这些警告,你可以打字:

    foo = (AbstractModel *)thisIsAModelImpl;
    

    ControllerB ,您只需将这一行添加到.h文件中

    ModelImpl *foo;
    

    而且,您希望重写(重新定义)任何处理 foo 在里面 控制器B .

    如果你有方法(在 ControllerA

    -setFoo:(AbstractModel *)newModel;
    -(AbstractModel *)foo;
    

    你要把这些行改成(in 控制器B )

    -setFoo:(ModelImpl*)newModel;
    -(ModelImpl*)foo;