【问题标题】:How to fire methods in subclass? [duplicate]如何在子类中触发方法? [复制]
【发布时间】:2013-12-03 04:10:22
【问题描述】:

如果我创建 ClassA 是 ClassB 的子类

@interface ClassA : ClassB

我想从超类 ClassB 中触发子类 ClassA 中的实例方法

怎么做?

谢谢

【问题讨论】:

  • 我可能只是很挑剔,但你不会先创建ClassA 并从ClassA 获得ClassB 子类吗?

标签: objective-c class


【解决方案1】:

设计问题。您违反了继承基础。 请参阅 OOP 书籍。

首先,超级类不知道子类中有什么。然而,它的相反是允许的。

如果你想这样做,你需要在Superclass中创建一个Subclass的实例,然后调用它。

其他方式是使用协议

您可以声明一个协议并让您的子类采用该协议 协议。然后你可以检查孩子是否接受 来自超类的协议并从超类调用方法 类。

Call subclass's method from its superclass

【讨论】:

    【解决方案2】:

    我想从超类 ClassB 中触发子类 ClassA 中的实例方法

    这取决于情况。如果该方法是一个被覆盖的实例方法,您只需调用它。也就是说,假设您在 ClassB 中有一些方法,而 ClassA 覆盖了其中一些方法:

    @implementation ClassB
    - (void)foo:(ClassB)b
    {
        [b bar];
    }
    
    - (void)bar
    {
        NSLog(@"I'm ClassB");
    }
    @end
    
    @implementation ClassA
    - (void)bar
    {
        NSLog(@"I'm ClassA");
    }
    @end
    

    现在,如果你有一个 ClassA 的实例:

    ClassA *a = [[ClassA alloc] init];
    

    然后你打电话给foo

    [a foo:a];
    

    然后调用 ClassA 的 bar 版本,你会得到:

    I'm ClassA
    

    另一方面,如果您希望 ClassB 调用 ClassA 中未在 ClassB 中声明的某个方法,您首先应该三思而后行。让一个类知道它的子类的具体事情通常表明你应该重构你的代码。如果父类对子类有期望,您通常希望通过在父类中声明方法然后要求重写这些方法来明确这一点。

    如果您确定要这样做,一种巧妙的方法是创建一个包含方法声明的协议。 ClassB.h 然后可以导入协议头,而无需具体了解 ClassA。所以假设你有一个名为 ProtocolC 的协议:

    @protocol
    - (void)baz;
    @end
    

    并且在某些情况下,您希望要求您使用的对象符合该协议。您可以像这样指定“采用 ProtocolC 的 ClassB 的实例”:

    ClassB<ProtocolC>* someObject;
    

    如果你想从 ClassB 调用baz,你可以像这样重写foo:

    @implementation ClassB
    - (void)foo:(ClassB<ProtocolC>*)b
    {
        [b baz];
    }
    @end
    

    现在您只需要在 ClassA 中采用 ProtocolC 并实现方法即可。还有其他可能性,但在这里使用协议将有助于保持整洁。

    我猜想这样做的原因是您知道您不会直接使用 ClassB,而是会创建一个或多个子类并使用它们。也就是说,ClassB 是一个抽象类,尽管 Objective-C 不区分抽象类和具体类。如果是这样,您应该跳过协议业务,在 ClassB 中声明您的抽象方法,并以提醒您在子类中提供更有用的实现的方式实现这些方法。例如,您的“抽象”方法都可能引发异常。

    【讨论】:

      【解决方案3】:

      在超类中声明方法,在子类中实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 2020-09-16
        • 1970-01-01
        • 2020-11-04
        • 1970-01-01
        相关资源
        最近更新 更多