理解的麻烦扩展和实例化。扩展与实例化类相同吗?

时间:2016-12-21 19:08:37

标签: java instantiation extends

我的问题是。这些都一样吗?

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 {
}

4 个答案:

答案 0 :(得分:0)

它们不一样。

在第一个示例中,通过继承,Fish的实例可以访问它自己的所有属性和方法,包括从Pet继承的属性和方法,通过this或{{1 },取决于语言。

在第二个示例中,self只是恰好是myPet类的实例的变量,但PetPet彼此没有关系

答案 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项:继承的设计和文件,否则禁止它

     

良好的面向对象   设计不是自由扩展现有的类。你的第一个   本能应该是组成。