【问题标题】:Setting a "grandparent" class in Objective C在 Objective C 中设置“祖父母”类
【发布时间】:2022-01-12 18:01:21
【问题描述】:

我正在创建多个不同的 UI 子类,这些子类可以使用 JSContext 创建,我希望它们都继承一组特定的方法。

课程从NSButtonNSTextView 不等。让一个子类充当NSView 父类会很好,但我不知道这是否可能——或者如何开始搜索。

例如:

@interface CustomButtonClass : NSButton

我正在寻找一种方法让 NSButton 继承自自定义 NSView 子类。

有没有办法解决这个问题,还是我需要创建多个中间类?

【问题讨论】:

  • 您是否希望在NSButtonNSView 之间有效地“注入”一个类,例如CustomButtonClass : NSButton : CustomViewClass : NSView?类继承是类本身的属性,而不是该类中的对象的属性 - 所以这样做会影响您的进程中的 all NSButtons、NSTextViews 等。既极其脆弱,又充满风险。您能否具体说明您希望这些类型继承什么? (可能还有其他方法可以将这些实现应用于您的类型。)
  • 这其实是我怀疑的。我希望创建很多方便的方法,可以使用JSExportJSContext 公开。正如你描述的一个非常好的反对我最初目标的案例,我想最明智的方法是创建一个JSExport 协议,它暴露了大部分原生核心NSView 的东西,然后手动实现其余的。
  • 这听起来很合理。根据您的特定需求,您可以使用 Obj-C 运行时至少自动执行部分操作:如果您创建自己的协议来优化 JSExport,您可以遍历所有符合该协议的类型和 class_addMethod /method_setImplementation 一个具体的实现,模仿从其他类型继承该实现的样子。
  • NSView 上的类别怎么样?
  • 只是说类别也可以继承自己的@protocols。

标签: objective-c macos cocoa appkit


【解决方案1】:

答案非常明显,但来自不同的语言,我很难建立联系。感谢所有的 cmets,这很容易弄清楚。

您可以为NSView 创建一个类别,而不是尝试在继承树的某处插入一个中间类。类别还可以包括所有必需的协议。

例如,在我的例子中,我想向JSContext 公开多个NSView 方法,并创建一些我自己的方法,它适用于任何NSView 派生的对象。

@protocol JSInterfaceExports <JSExport>

// Anything you want to expose to JS
- (void)customMethod;

// You can also expose all the common NSView properties
// and methods to JS in this protocol
@property (nonatomic) NSRect frame;
- (void)removeFromSuperview;

@end

@interface NSView (JSInterface)

// Any custom methods and properties
- (void)customMethod;

@end

将此文件包含在任何NSView 子类中,使它们符合&lt;JSInterfaceExports&gt;,然后就可以设置了。

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多