iPhone——抽象类的init方法

发布于 2024-08-27 09:17:05 字数 340 浏览 8 评论 0原文

我想创建具有以下属性的汽车、车辆和飞机类:

  • 汽车和飞机都是车辆的子类。
  • 汽车和飞机都有一个 initWithString 方法。
  • 汽车和飞机的 initWithString 方法可接受的输入字符串不重叠。
  • 车辆是“几乎抽象的”,因为任何初始化的实例都应该是汽车或飞机。
  • 可以将字符串传递到 Vehicle 并返回 Car 实例、Airplane 实例或 nil,具体取决于输入字符串。

我应该更喜欢什么特定的设计模式?特别是对于 Vehicle 的 initWithString 和/或 newVehicleWithString 方法。

I want to create classes Car, Vehicle, and Airplane with the following properties:

  • Car and Airplane are both subclasses of Vehicle.
  • Car and Airplane both have an initWithString method.
  • The acceptable input strings for Car's and Airplane's initWithString methods do not overlap.
  • Vehicle is "almost abstract", in the sense that any initialized instance should be either a Car or an Airplane.
  • It is possible to pass a string into Vehicle and get back an instance of Car, an instance of Airplane, or nil, depending on the input string.

Any particular design pattern I should prefer? In particular for Vehicle's initWithString and/or newVehicleWithString methods.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

感情洁癖 2024-09-03 09:17:05

您需要的是“类簇”模式。您的 Vehicle initWithString: 方法可能如下所示:

- (id) initWithString:(NSString *)mode {
  // note that we don't call [super init] in a class cluster. 
  // instead, we have to release self because it's an unwanted Vehicle instance
  [self release];
  if([mode isEqualToString:@"wheels"]) {
    return [[Car alloc] initWithString:@"wheels"];
  }
  if([mode isEqualToString:@"wings"]) {
    return [[Airplane alloc] initWithString:@"wings"];
  }
  return nil;  //alternately, raise NSInvalidArgumentException
}

What you need is the "class cluster" pattern. Your Vehicle initWithString: method could look something like this:

- (id) initWithString:(NSString *)mode {
  // note that we don't call [super init] in a class cluster. 
  // instead, we have to release self because it's an unwanted Vehicle instance
  [self release];
  if([mode isEqualToString:@"wheels"]) {
    return [[Car alloc] initWithString:@"wheels"];
  }
  if([mode isEqualToString:@"wings"]) {
    return [[Airplane alloc] initWithString:@"wings"];
  }
  return nil;  //alternately, raise NSInvalidArgumentException
}
捂风挽笑 2024-09-03 09:17:05

从超类引用子类并不是一个好主意。

如果您确实必须这样做,您至少应该使用像 vehicleWithString: 这样的类方法。

事实上,我怀疑另一种方法(使用vehicle initWithString:来创建汽车或飞机的实例)是否有效。

Referring to a subclass from a superclass is not a good idea.

If you really have to do this, you should at least go with a class method like vehicleWithString:.

In fact, I doubt that the other approach (using vehicle initWithString: to create instances of Car or Airplane) would work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文