代码之家  ›  专栏  ›  技术社区  ›  Richard J. Ross III

内部课程目标C

  •  1
  • Richard J. Ross III  · 技术社区  · 14 年前

    我正在将一个项目从C#移植到Objective-C,我想知道如何在Objective-C中实现一个内部类(内部含义只在这个项目内部可见)。

    public abstract class AbstractBaseClass : AInterface
    {
         // methods go here
    }
    
    internal class InternalSubclass : AbstractBaseClass
    {
         // methods go here
    }
    

    // AbstractBaseClass.h
    #import <Foundation/Foundation.h>
    #import "AInterface.h"
    
    @interface AbstractBaseClass : NSObject<AInterface>
    
    // methods go here
    
    @end
    
    // AbstractBaseClass.m
    #import "AbstractBaseClass.h"
    
    @implementation AbstractBaseClass
    
    -(void) abstractMethod
    {
          [NSException raise:@"abstract method" format:@"This method is abstract, and thus cannot be called"];
    }
    
    // more methods
    
    @end
    

    我应该把internalsubclass的接口和实现放在哪里?它们应该在一个单独的文件中吗 InternalClasses.h/m

    任何帮助都将不胜感激!

    4 回复  |  直到 14 年前
        1
  •  2
  •   JeremyP    14 年前

    我通常的做法是在基类的.m文件中声明内部类的接口和实现。

    当然,如果类变大,您可能需要将它们分开以避免文件太大。如果您正在编写一个框架,那么有一种机制可以指定哪些头被公开(即导出到框架的headers目录),否则,您只需使用文档。

        2
  •  1
  •   Ben Zotto sberry    14 年前

    在Obj-C中没有“internal”的概念,正如Joshua所说的,最好的方法就是保持“internal”子类的头私有,只记录基类的接口。

    NSString NSImage ,您将得到具有相同接口的其他内容。

    在Obj-C中实现这一点的另一种方法是使用正式协议:

    @protocol AbstractInterface
    - (void)method1;
    ...
    @end
    

    而不是到处转悠 AbstractBaseClass * id<AbstractInterface> s、 如果基类的状态为零并且没有默认实现,那么它们是等价的。

    解决另一个问题:每个类都应该有自己的.h和.m文件。不管在什么特定的背景下,这几乎总是正确的。

        3
  •  0
  •   Joshua Weinberg    14 年前

    是的,真正拥有“内部”类的唯一方法是隐藏它们的头。但即便如此,如果任何人知道这些类的名称,那么使用这些类也是微不足道的,我想说的是,你可能会考虑重新设计它,而不是使用Obj-C并不真正适合的类设计风格。

    如果不知道你在做什么,我不能建议一个不同的设计虽然。

        4
  •  0
  •   Richard J. Ross III    14 年前

    @package