Cocoa 如何覆盖方法的一小部分?

Cocoa 如何覆盖方法的一小部分?,cocoa,Cocoa,目前我在课堂上使用了这些方法,似乎效果不错。我想创建一个继承这些方法的子类。我的问题是,在第三种方法(shiftviewupworkeyboard)中,我希望if语句是不同的UITextField(镜像是当前的示例)。 我已经读过,要覆盖子类中的方法,基本上必须使用新的编码完全复制它,但是如果我只想更改那一小部分,那么最好的方法是什么? 先谢谢你 - (void) viewWillAppear:(BOOL)animated { [[NSNotificationCenter defaultCen

目前我在课堂上使用了这些方法,似乎效果不错。我想创建一个继承这些方法的子类。我的问题是,在第三种方法(shiftviewupworkeyboard)中,我希望if语句是不同的UITextField(镜像是当前的示例)。 我已经读过,要覆盖子类中的方法,基本上必须使用新的编码完全复制它,但是如果我只想更改那一小部分,那么最好的方法是什么? 先谢谢你

- (void) viewWillAppear:(BOOL)animated {

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(shiftViewUpForKeyboard:)
                                             name: UIKeyboardWillShowNotification
                                           object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(shiftViewDownAfterKeyboard)
                                             name: UIKeyboardWillHideNotification
                                           object: nil];


}

- (void) viewDidDisappear:(BOOL)animated {
[[NSNotificationCenter defaultCenter] removeObserver: self
                                                name: UIKeyboardWillShowNotification
                                              object: nil];
[[NSNotificationCenter defaultCenter] removeObserver: self
                                                name: UIKeyboardWillHideNotification
                                              object: nil];


}

- (void) shiftViewUpForKeyboard: (NSNotification*) theNotification;
{
if(mirror.isEditing == YES)
{

CGRect keyboardFrame;
NSDictionary* userInfo = theNotification.userInfo;
keyboardSlideDuration = [[userInfo objectForKey: UIKeyboardAnimationDurationUserInfoKey] floatValue];
keyboardFrame = [[userInfo objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue];

UIInterfaceOrientation theStatusBarOrientation = [[UIApplication sharedApplication] statusBarOrientation];

if UIInterfaceOrientationIsLandscape(theStatusBarOrientation)
    keyboardShiftAmount = keyboardFrame.size.width;
else 
    keyboardShiftAmount = keyboardFrame.size.height;

[UIView beginAnimations: @"ShiftUp" context: nil];
[UIView setAnimationDuration: keyboardSlideDuration];
self.view.center = CGPointMake( self.view.center.x, self.view.center.y - keyboardShiftAmount);
[UIView commitAnimations];
viewShiftedForKeyboard = TRUE;
}
}

通常的方法是:只提取类之间不同的方法的一部分,将其作为一个单独的方法,并在子类中重写它


[编辑以添加…]另一种方法——如果不看更多的代码,我无法判断它在这里是否能正常工作——是使传递到方法中的参数发生变化(或者根据传递到方法中的参数或其他类似的内容来选择它)。(你通常会使用其他机制,而不是继承+多态来获得你想要的效果,多个行为相似的东西:它们是同一个类的实例,但提供不同的数据。)

通常的方法是:只提取不同类之间的方法的一部分,将其作为单独的方法,并在子类中重写


[编辑以添加…]另一种方法——如果不看更多的代码,我无法判断它在这里是否能正常工作——是使传递到方法中的参数发生变化(或者根据传递到方法中的参数或其他类似的内容来选择它)。(然后通常使用其他机制,而不是继承+多态性,以获得多个具有类似行为的对象的效果:它们是同一类的实例,但提供不同的数据。)

在任何情况下,如果您不想复制子类中的完整方法,并添加少量自定义,我看到的唯一其他可能的方法是更改原始类。为此,我可以提出两种可能性:

(一) 您可以在原始类中创建一个名为:
-(UITextField *)keyboardShiftTextField
代码为:

[[self keyboardShiftTextField] isEditing]
在这种情况下,两个类之间的唯一区别在于新方法的实现,原始类的区别在于:
-(UITextField *)keyboardShiftTextField {
return mirror;
}
在子类中,返回正确的文本字段

(二)
第二种方法更加优雅,因为它需要委托模式的定义。这需要一些代码开销,但我们将为您提供更大的灵活性。此外,如果创建子类的唯一原因只是重写第三个方法,那么使用委托模式可以完全避免创建子类,因为“自定义”工作将由委托完成。如果要重写的方法的数量不止一个,您仍然可以通过将所有需要自定义的部分移到“协议”部分来使用此机制。这是Obj-C和Cocoa非常常见的技术,在许多情况下限制了对某些类的需要。通常,当您想要提供不同的功能时,您会使用子类,但在您的情况下,您并没有提供不同的功能,只是为相同的功能进行了自定义(视图上移)。

在任何情况下,如果您不想复制子类中的完整方法,并添加您的小自定义,我看到的唯一其他可能的方法是更改原始类。为此,我可以提出两种可能性:

(一) 您可以在原始类中创建一个名为:
-(UITextField *)keyboardShiftTextField
代码为:

[[self keyboardShiftTextField] isEditing]
在这种情况下,两个类之间的唯一区别在于新方法的实现,原始类的区别在于:
-(UITextField *)keyboardShiftTextField {
return mirror;
}
在子类中,返回正确的文本字段

(二)
第二种方法更加优雅,因为它需要委托模式的定义。这需要一些代码开销,但我们将为您提供更大的灵活性。此外,如果创建子类的唯一原因只是重写第三个方法,那么使用委托模式可以完全避免创建子类,因为“自定义”工作将由委托完成。如果要重写的方法的数量不止一个,您仍然可以通过将所有需要自定义的部分移到“协议”部分来使用此机制。这是Obj-C和Cocoa非常常见的技术,在许多情况下限制了对某些类的需要。通常,当您想要提供不同的功能时,您会使用子类,但在您的情况下,您并没有提供不同的功能,只是为相同的功能提供了一个自定义(视图向上移动)。

感谢您的快速回复:所以可能类似于-(void)shiftviewupworkeyboard:(NSNotification*)通知:(UITextField*)theTextField{if(theTextField.isEditing==YES)诸如此类,诸如此类感谢您提供的有趣链接是的,您所描述的是我提到的“替代方法”。有关我描述的应用于您的代码的第一种方法的更多详细信息,请参阅viggio24的答案。感谢您的快速回复:所以可能类似于-(void)shiftviewupworkyboard:(NSNotification*)notification:(UITextField*)theTextField{if(theTextField.isEditing==YES)blah,blah}??谢谢你的有趣链接是的,你描述的是“替代方法”我提到过。有关我描述的应用于您的代码的第一种方法的更多详细信息,请参阅viggio24的答案。谢谢@viggio24。我喜欢代表的想法,因为这只是我想要调整的代码的一小部分,所以这个过程可能对我非常有帮助。我想我应该研究Apple文档,除非您有一些We’还行吗?我没有具体的教程。但是你会在这里找到一个来自苹果的很棒的文档:谢谢@viggio24。我喜欢代理的想法,因为这只是我想要的代码的一小部分