UIView和UIImageView的公共基类/代码-objective-c中多重继承的替代方案
我在从UIView或UIImageView派生的所有类中都需要一些功能 更具体地说,我有这两个类都需要的手势相关代码。UIView和UIImageView的公共基类/代码-objective-c中多重继承的替代方案,objective-c,cocoa-touch,Objective C,Cocoa Touch,我在从UIView或UIImageView派生的所有类中都需要一些功能 更具体地说,我有这两个类都需要的手势相关代码。 目前我的实现是: UIGestureView : UIView UIGestureImageView : UIImageView 并使所有类都从这些类派生。 这些类将再次包含派生类将实现的方法 我的问题是手势处理代码在UIGestureView和UIGestureImageView中重复 这里的自然事物(作为C++程序员)将使用多重继承< /P> UIGestureView
目前我的实现是:
UIGestureView : UIView
UIGestureImageView : UIImageView
并使所有类都从这些类派生。
这些类将再次包含派生类将实现的方法
我的问题是手势处理代码在UIGestureView
和UIGestureImageView
中重复
这里的自然事物(作为C++程序员)将使用多重继承< /P>
UIGestureView : UIView, GestureHandler
UIGestureImageView : UIImageView, GestureHandler
让GestureHandler
执行所有的常规工作,但据我所知,这是不可能的
这样做的objective-c方法是什么(没有太多级别的孩子呼叫家长等)
要强调的是,问题在于如何避免两次实现同一代码,一次在UIView(或其派生类)中,一次在UIImageView(或其派生类)中。您可以通过手势处理扩展
UIView
,然后,从UIView
继承的每个对象都将拥有您想要的方法。不太可怕和子类化,但可以在全局范围内工作
@interface UIView (GestureHandling)
- (void)didMoveAFinger:(UITouch*)touchOrWhatever;
// etc., etc.
@end
我在
UIViewController
和UITableViewController
方面也遇到过类似的问题。我有一个子类,我想和另一个子类共享代码。然而,如果您想要一个子类,就没有通用的地方来注入代码。另一种选择是公共超类上的类别。您可以通过手势处理扩展UIView
,然后从UIView
继承的每个对象都将具有您想要的方法。不太可怕和子类化,但可以在全局范围内工作
@interface UIView (GestureHandling)
- (void)didMoveAFinger:(UITouch*)touchOrWhatever;
// etc., etc.
@end
我在
UIViewController
和UITableViewController
方面也遇到过类似的问题。我有一个子类,我想和另一个子类共享代码。然而,如果您想要一个子类,就没有通用的地方来注入代码。另一种选择是公共超类上的类别。您应该尝试使用协议和委派。他们解决了objective-c中的多重继承问题
@protocol MyProtocol <NSObject>
//Method declarations go here
@end
@protocol MyProtocol2 <NSObject>
//Method declarations go here
@end
@interface CustomView : UIView <MyProtocol, MyProtocol2>
@protocol-MyProtocol
//方法声明在这里
@结束
@协议MyProtocol2
//方法声明在这里
@结束
@界面自定义视图:UIView
您应该尝试使用协议和委派。他们解决了objective-c中的多重继承问题
@protocol MyProtocol <NSObject>
//Method declarations go here
@end
@protocol MyProtocol2 <NSObject>
//Method declarations go here
@end
@interface CustomView : UIView <MyProtocol, MyProtocol2>
@protocol-MyProtocol
//方法声明在这里
@结束
@协议MyProtocol2
//方法声明在这里
@结束
@界面自定义视图:UIView
签出类别:签出类别:协议不解决多重继承问题,因为它们不包含代码。它们确实为不相关类之间的公共接口提供了模板,但不允许您执行诸如处理手势代码之类的操作。您仍然需要将代码放在某个地方。协议/委托似乎只是为回调添加了一个附加层-我试图避免这种情况。协议不能解决多重继承问题,因为它们不包含代码。它们确实为不相关类之间的公共接口提供了模板,但不允许您执行诸如处理手势代码之类的操作。您仍然需要将代码放在某个地方。协议/委托似乎只是为回调添加了一个附加层-我正在尝试避免这种情况。这仍然不能解决代码重复的问题,因为我需要在UIImageView中使用相同的行为。@LK:UIImageView是UIView的一个子类。好的-在另一个答案中看到了相同的情况。我会看看这个-谢谢@洛克:查克是对的。您添加到UIView
的任何方法都可以在其所有子类上访问,包括UIImageView
以及SDK中的几十个其他类。这仍然不能解决代码重复的问题,因为我需要UIImageView中的相同行为。@LK:UIImageView是UIView的一个子类。好的-在另一个答案中也看到了同样的问题。我会看看这个-谢谢@洛克:查克是对的。您添加到UIView
的任何方法都可以在其所有子类上访问,包括UIImageView
以及SDK中的几十个其他类。作为这里的另一个答案,这允许向现有类添加代码,但不能解决代码重复的问题,由于我需要在UIView和UIImageView中都存在完全相同的代码,UIView上的类别应该可以解决您的问题,因为UIImageView继承自UIView。这里的另一个答案是,这允许向现有类添加代码,但不能解决代码重复的问题,由于我需要在UIView和UIImageView中都存在完全相同的代码,UIView上的类别应该可以解决您的问题,因为UIImageView继承自UIView。