如何在具有相同根类的2个类之间共享代码?

时间:2012-07-09 12:53:46

标签: objective-c macos cocoa oop inheritance

我创建了一个名为RCTextField的自定义类,其目的是创建一个带圆角的NSTextField(因此RC...)。

RCTextField继承自NSTextField并覆盖drawRect:方法,以创建自己的圆角矩形。

现在,我想为NSSecureTextField做同样的事情,也就是说,有办法让它有圆角。我不能让它继承RCTextField,因为那个NSSecureTextField的文本没有任何安全实现。

如果我从NSSecureTextField继承,我将不得不重新编写所有drawRect:实现。

我想到的一个选项是拥有一个RCBaseTextField类,其中包含一个名为drawRect:forNSTextField:withParams:的静态方法,并在drawRect: RCTextFieldRCSecureTextField中调用该方法{1}}。然而,这看起来有点像hackish,并且感觉在Objective-C中可以有更好的OOP方式来做到这一点。

那么,在RCTextFieldRCTextField之间分享来自RCSecureTextField的绘制圆角代码的最佳/最佳/软件工程 - “esquest”方式是什么? ?

5 个答案:

答案 0 :(得分:1)

我发现对象组合可以帮助解决这类问题。将所有共享的方法移动到一个单独的类中,然后让RCTextFieldRCSecureTextField对您的助手类进行内容并适当地调用方法。

答案 1 :(得分:1)

使用此原型制作C函数:

void drawTextFieldRoundRect(NSTextField* instance, CGRect rect);

在一个名为(例如)TextFieldRounded.h的文件中声明并在相应的TextFieldRounded.m中定义(不包含任何类,只包含此C函数。但是将它设为.m以便您可以使用Objective-C语法)

在此功能中,您可以执行自定义绘图。您可以通过参数instance访问“自我”。

接下来,在RCTextField中,您实现-drawRect:,如下所示:

#import "TextFieldRounded.h"

- (void) drawRect:(CGRect) rect
{
    drawTextFieldRoundRect(self, rect);
}

(并为RCSecureTextField执行相同的操作)

不是最优雅的,我知道......

选项2 :如果您使用的是舍入文本字段 ,则可以在NSTextField上添加类别,NSSecureTextField应继承“舍入”行为。但是,如果你想要圆形的普通文本字段,它就不能这样做。

答案 2 :(得分:1)

听起来像依赖注入的情况(注意:NSSecureTextField继承自NSTextField):

@interface RCTextField : NSObject {
  NSTextField *textField
}
- (id) initWithTextField:(NSTextField *)_textField;

@end

然后公开你想要的任何功能。

答案 3 :(得分:1)

不幸的是,你不能从另外一个类中创建一个Objective-C继承行为。我认为提供一个函数(使用面向对象的语言并不妨碍在适当的时候使用函数)将由drawRect:实现调用是更简单的方法。

或者您可以忽略NSSecureTextField并使RCSecureTextField继承自RCTextField。然后实现类方法cellClass以返回NSSecureTextFieldCell,您应该获得与NSSecureTextField完全相同的功能。

@interface RCSecureTextField : RCTextField
@end

@implementation RCSecureTextField
+ (Class)cellClass { return [NSSecureTextFieldCell class]; }
@end

答案 4 :(得分:1)

您可能希望继承NSTextFieldCell,而不是控件。我会继承NSSecureTextFieldCell并在两个控件中使用它;从绘图的角度来看,唯一的区别是echosBullets属性的值。