【问题标题】:Construction "Class<? extends SomeType>" variable declaration in Objective-C在 Objective-C 中构造“Class<? extends SomeType>”变量声明
【发布时间】:2011-03-23 13:01:19
【问题描述】:

我只是好奇是否可以在 Objective-C 中以 Java 中已知的方式声明变量:

Class<?extends SomeType>

例如:我有一个名为 MyClass 的类。它有一个静态方法

+ (void)myMethod

它还有两个子类:MySubclassA 和 MySubclassB。我有这样的代码:

Class myClass;
if(<some condition>) {
  myClass = [MySubclassA class];
} else {
  myClass = [MySubclassB class];
}
[myClass myMethod];

这段代码运行良好,没有编译器警告,但我只是好奇我提到的构造是否存在于 Objective-C 中。

谢谢!

【问题讨论】:

    标签: objective-c class extends


    【解决方案1】:

    Objective-C 没有模板(如 C++)或带有类型擦除的泛型类型(如 Java)或运行时泛型类型(如 C#)。与这些语言不同,Objective-C 消息在运行时动态分发(而不是在编译时绑定)。因此,许多用于在 C++、Java 或 C# 中生成与类型无关的代码的系统是不必要的。 Objective-C 更喜欢“duck-typing”,即任何响应给定选择器(消息)的对象都可以通过调用代码来获得该消息,而不管接收对象的类型如何。由于类在 Objective-C 中是对象,所以类方法和实例方法一样。

    所以,给定

    @interface MyClassA : NSObject
    {}
     - (void)someMethod;
    @end
    
    @interface MyClassB: NSObject
    {}
     - (void)someMethod;
    @end
    

    调用代码可以是这样的

    - (void)someOtherMethodInAnOtherClassWithObject:(id)obj
    {
      [obj someMethod];
    }
    

    假设objMyClassAMyClassB 的实例任一,此代码将编译并在运行时正常工作。

    当然,好的做法是在这种情况下定义@protocol

    @protocol MyProtocol
     - (void)myMethod
    @end
    

    并声明您的MyClassAMyClassB 都实现了MyProtocol 协议。你的调用代码看起来像

    - (void)someOtherMethodInAnOtherClassWithObject:(id<MyProtocol>)obj
    {
      [obj someMethod];
    }
    

    如果你试图调用someOtherMethodInAnOtherClassWithObject:,编译器会给你一个警告/错误(取决于-W标志),传递一个不实现MyProtocol接口的类型的对象。

    注意id&lt;MyProtocol&gt; 不是泛型类型,它是您声称实现MyProtocol 协议的id 类型的实例。另请注意,客户端代码的第一个版本运行良好,因为真正重要的是obj 是否可以响应-myMethod 选择器。

    【讨论】:

    • 这都是真的,但请注意原来的问题是询问静态方法。
    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多