我的问题是。这些都一样吗?
idMap
sampleDict
如果我将Pet类扩展到Fish类,那就像我在Fish类中实例化Pet类一样吗?扩展在上面,实例在下面。它们是一样的吗?
#import "ViewController.h"
@interface ViewController ()
@property NSMutableArray * arrayTesting;
@property NSMutableDictionary * sampleDict;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.sampleDict = [NSMutableDictionary new];
[self.sampleDict setObject:@"FooIndex" forKey:@"Key_1"]; // adds @"Foo"
[self.sampleDict setObject:@"FooOne" forKey:@"Key_2"]; // adds @"Foo"
[self.sampleDict setObject:@"FooTwo" forKey:@"Key_3"]; // adds @"Foo"
[self.sampleDict setObject:@"FoFour" forKey:@"Key_4"]; // adds @"Foo"
[self.sampleDict setObject:@"FooFivve" forKey:@"Key_5"]; // adds @"Foo"
self.arrayTesting = [NSMutableArray new];
[self.arrayTesting addObject:self.sampleDict];
NSLog(@"Sample arraytesting>>>>> %@",self.arrayTesting);
}
- (IBAction)buttonAction:(id)sender {
NSMutableDictionary * toModify = [self.sampleDict mutableCopy];
[toModify setObject:@"One" forKey:@"Key_1"]; // adds @"Foo"
[toModify setObject:@"Two" forKey:@"Key_2"]; // adds @"Foo"
[toModify setObject:@"Three" forKey:@"Key_3"]; // adds @"Foo"
[toModify setObject:@"FoFour" forKey:@"Key_4"]; // adds @"Foo"
[toModify setObject:@"FooFivve" forKey:@"Key_5"]; // adds @"Foo"
[self.arrayTesting addObject:toModify];
NSLog(@"Sample arraytesting>>>>> %@",self.arrayTesting);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
public class Pet {
}
答案 0 :(得分:0)
它们不一样。
在第一个示例中,通过继承,Fish
的实例可以访问它自己的所有属性和方法,包括从Pet
继承的属性和方法,通过this
或{{1 },取决于语言。
在第二个示例中,self
只是恰好是myPet
类的实例的变量,但Pet
和Pet
彼此没有关系
答案 1 :(得分:0)
不,他们完全不同。
在这一个public class Fish extends Pet { }
中,您使用继承将Pet类扩展为Fish类,这意味着Fish是Pet的子类,它将继承Pet类。
然而在这一个
public class Fish {
Pet myPet = new Pet (); }
你正在创建一个名为Fish的全新对象,它不会从任何东西扩展,只是它有一个类级别对象是Pet,所以你可以通过myPet对象使用Pet对象方法变量等但是它不是由Fish继承,所以Fish将是它自己的对象,而不是Pet的子类。
这些是差异。
至于何时应该使用哪个,这里是一般规则:如果你正在增强一个类,那么你应该使用继承,但是如果你只是要为它的特定函数使用一个类,那么你应该将它实例化为类中的变量。
答案 2 :(得分:0)
他们完全不同。延伸是'是 - a'关系,而后来(组成)是'a-a'。请查看here了解更多详情。
答案 3 :(得分:0)
第一个例子描述了继承,第二个例子描述了组合。这是两个OOP概念。它们允许程序员重用通用逻辑。你应该更喜欢使用composiiton而不是继承。
从其他SO answer复制:
他们完全不同。继承是一个" is-a"关系。 作文是" has-a"。
通过将另一个类C的实例作为字段来进行组合 你的班级,而不是扩展C.一个很好的例子 组合会比继承更好 java.util.Stack,目前扩展了java.util.Vector。这是现在 被认为是一个大错。堆栈" is-NOT-a"向量;你不应该 允许随意插入和删除元素。它应该是 而不是组成。
不幸的是,为了纠正这个设计错误已经太晚了 现在更改继承层次结构会破坏与之的兼容性 现有代码。如果堆栈使用的是组合而不是继承,那么 始终可以修改为使用其他数据结构而不会违反 API。
我强烈推荐Josh Bloch的书“Effective Java 2nd Edition”
第16项:赞成合成而不是继承
第17项:继承的设计和文件,否则禁止它
良好的面向对象 设计不是自由扩展现有的类。你的第一个 本能应该是组成。