gpt4 book ai didi

objective-c - 在 Objective-C 中模拟方法重载

转载 作者:搜寻专家 更新时间:2023-10-30 20:09:16 25 4
gpt4 key购买 nike

我正在用 Objective-C 编写一个数学库(为了好玩),现在我需要一些方法来模拟 C++ 风格的函数重载。

我想要的样子:

NSNumber *x = @(25);
CMVector *v = [CMVector vectorWithElements:@12, @14, @18, nil];
CMMatrix *m = [CMMatrix matrixWithRows:@[@12, @13, @0 ],
@[@24, @26, @30],
@[@0, @0, @1 ], nil];
CMMatrix *i = [CMMatrix identityMatrixWithRank:3];

NSLog(@"%@ %@ %@ %@", [x multiply:v], [x multiply:m], [m multiply: i], [v multiply:x]);

有什么办法可以实现吗?

这是我想出的一种可能的方法,使用类来表示重载函数并将参数名称编码为类方法名称,例如:

@interface CMMultiply : NSProxy

+ (NSNumber *)NSNumber:(NSNumber *)left NSNumber:(NSNumber *)right;
+ (CMVector *)NSNumber:(NSNumber *)left CMVector:(CMVector *)right;
+ (CMVector *)CMVector:(CMVector *)left NSNumber:(NSNumber *)right;
+ (CMVector *)CMVector:(CMVector *)left CMVector:(CMVector *)right;
+ (CMMatrix *)NSNumber:(NSNumber *)left CMMatrix:(CMMatrix *)right;
+ (CMMatrix *)CMMatrix:(CMMatrix *)left NSNumber:(NSNumber *)right;
+ (CMMatrix *)CMMatrix:(CMMatrix *)left CMMatrix:(CMMatrix *)right;

@end

并通过创建编码的方法名称并调用它来实现重载方法。

有什么更好的主意吗?

编辑

这是我的重载逻辑:

@implementation NSObject (CMOverloading)

- (NSString *)overloadingClassName
{
return NSStringFromClass([self class]); // Override this to handle class clusters
}

- (id)callOverloadedMethod:(Class)method withObject:(id)other
{
NSString *methodName = [NSString stringWithFormat:@"%@:%@:", [self overloadingClassName], [other overloadingClassName]];
SEL selector = NSSelectorFromString(methodName);
return objc_msgSend(method, selector, self, other);
}

@end

编辑 2

“重载库”的基类是 NSProxy,因此库的用户无法实例化它。

编辑 3

实现简化宏:

#define CMOverloadingMethod(_return, _left, _right) \
+ (_return *)_left:(_left *)left _right:(_right *)right

#define CMOverloadedMethod(_type, _object) \
return [self callOverloadedMethod:[_type class] withObject:(_object)]

一个重载的方法仍然需要一个(简单的)单一实现,在这里,直接在 NSObject 中:

- (id)multiply:(id)right
{
CMOverloadedMethod(CMMultiply, right);
}

并通过NSNumber实现:

@implementation CMMultiply (NSNumber)

CMOverloadingMethod(NSNumber, NSNumber, NSNumber)
{
return @([left doubleValue] * [right doubleValue]);
}

@end

最佳答案

实现这个语法

NSLog(@"%@ %@ %@ %@", [x multiply:v], [x multiply:m], [m multiply: i], [v multiply:x]);

您必须在每个数学类(向量、矩阵)中实现一个乘法方法,并在 NSNumber 上实现一个类别方法。问题是您还希望能够传递任何参数,而这在 Objective-C 中不受支持(具有相同名称但参数类型不同的多个方法)。

相反,您可以将 id 作为参数并在运行时找出类型,否则您将不得不更加冗长:

NSLog(@"%@ %@ %@ %@", [x multiplyWithVector:v], 
[x multiplyWithMatrix:m],
[m multiplyWithMatrix:i],
[v multiplyWithScalar:x]);

但这太复杂了,而且,实现这样的数学库会很慢。

为什么不使用简单的结构和函数呢?这已经做了很多次并且有效。

关于objective-c - 在 Objective-C 中模拟方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20334451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com