我正在将一个 Objective-C/Cocoa 的小库移植到 Python/PyObjC 中。而且我对实施方式感到困惑。
原始代码如下所示:
@implementation HUDWindow
- (id)initWithContentRect:(NSRect)contentRect
styleMask:(unsigned int)styleMask
backing:(NSBackingStoreType)bufferingType
defer:(BOOL)flag
{
if (self = [super initWithContentRect:contentRect
styleMask:NSBorderlessWindowMask
backing:bufferingType
defer:flag]) {
// initialize code here
:
:
:
:
:
:
return self;
}
}
在头文件中说HUDWindow类继承了NSPanel。据我阅读代码,初始化是这样的:
- HUDWindow 的 initContentRect 覆盖 NSPanel 的 initContentRect。
- 在 HUDWindow 的 initContentRect 内部,NSPanel 的 initContentRect 被调用并得到结果为“self”。
首先,我这样写python代码。这是一个字一个字的翻译:
class HUDWindow(NSPanel):
def initWithContentRect_styleMask_backing_defer_(self, rect, style, buf, flag):
self = NSPanel.initWithContentRect_styleMask_backing_defer_(
rect, NSBorderlessWindowMask, buf, flag)
# initialize code here
:
:
:
:
:
:
return self
它不起作用,因为self
它只是NSPanel
. 我不能调用从原始 obj-c 代码移植的任何令人上瘾的函数。
所以我像这样更改了我的代码:
class HUDWindow(NSPanel):
def initWithContentRect_styleMask_backing_defer_(self, rect, style, buf, flag):
self.window = NSPanel.initWithContentRect_styleMask_backing_defer_(
rect, NSBorderlessWindowMask, buf, flag)
# initialize code here
:
:
:
:
:
:
return self.window
它工作得更好一点。至少,我可以在这个初始化函数中调用其他函数。但是在初始化函数之外,我不能调用从原始代码移植的其他函数。
所以我尝试这样:
class HUDWindow(NSPanel):
def initWithContentRect_styleMask_backing_defer_(self, rect, style, buf, flag):
self.window = NSPanel.initWithContentRect_styleMask_backing_defer_(
rect, NSBorderlessWindowMask, buf, flag)
# initialize code here
:
:
:
:
:
:
self.window.setTitle_ = self.setTitle_
return self.window
它没有用。创建实例后我无法覆盖或添加函数。
现在我觉得我做错了。是否有任何常见的方法来继承像 NSPanel 或 NPWindow 这样的类?