UIView和UIImageView的公共基类/代码-objective-c中多重继承的替代方案

UIView和UIImageView的公共基类/代码-objective-c中多重继承的替代方案,objective-c,cocoa-touch,Objective C,Cocoa Touch,我在从UIView或UIImageView派生的所有类中都需要一些功能 更具体地说,我有这两个类都需要的手势相关代码。 目前我的实现是: UIGestureView : UIView UIGestureImageView : UIImageView 并使所有类都从这些类派生。 这些类将再次包含派生类将实现的方法 我的问题是手势处理代码在UIGestureView和UIGestureImageView中重复 这里的自然事物(作为C++程序员)将使用多重继承< /P> UIGestureView

我在从UIView或UIImageView派生的所有类中都需要一些功能

更具体地说,我有这两个类都需要的手势相关代码。
目前我的实现是:

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。