1

好吧,想象一下我有一个动物园,我只希望它包含某种颜色的动物。我有一个 Zoo 对象,它有一个颜色属性(在这个例子中,一个字符也可以是某种对象)。我还有一个 Animal 类,我从不实例化它(我仍然认为它是抽象的,我是 java),因为我用动物类型扩展了它。

我想检查是否可以将特定的动物类型添加到我的动物园。我不喜欢让颜色成为 Animal 的属性并且必须先实例化每个 Animal 才能检查我是否可以拥有一个的想法。在我看来,我希望 color t 是 Animal 的类变量而不是实例变量,至少我在 Java 中是这样做的,但我知道风格完全不同。

我的解决方案是:

在动物园控制器中:

if([zoo canAddAnimalOfType:[Elephant class]])
{
     [zoo addAnimal:([Elephant animal])];
}

在动物园里:

@property char colour;

- (BOOL)canAddAnimalOfType:(Class)animalType
{
    if([animalType colour] == colour)
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

这是我在Animal(大象扩展)中缺少类变量的解决方案:

+(char)colour
{
    return 'n';
}

所以实际上我使用了一个类方法来封装一个类变量,这对我来说似乎有点乱。我的问题是,这是 Objective C 的方式吗?如果不是,那会是什么?

谢谢

4

2 回答 2

3

是的,这是 Objective-C 的方式(尽管示例场景是有问题的)。当您有一个值保证对于类的所有实例都相同,但可能会根据子类而改变时,请使用类方法返回该值。(这不是类方法的唯一用途。)

以下是 Apple 框架中的一些示例。还有其他的。

于 2013-07-02T08:06:43.913 回答
1

就我个人而言,这在我看来是错误的。对于这种情况,类方法感觉很难看。我将实例化 Elephant 对象,然后测试该实例是否可以进入动物园。为什么?因为您可能希望大象拥有不止一种颜色。您可以简单地在每个实例上设置@property,然后将实例传递给动物园进行测试,而不是为每个不同的变体进行子类化。

如果初始化 Animal 对象非常昂贵,您可以使用稍微不同的模式。创建一个名为 AnimalDescriptor 的轻量级类,您可以实例化它来描述动物的属性而不是实际对象。如果测试通过,则使用描述符创建完整对象。

于 2013-07-02T08:50:29.763 回答