相关疑难解决方法(0)

打字稿:如何扩展两个类?

我希望节省我的时间,并在扩展PIXI类(2d webGl渲染器库)的类之间重用公共代码.

对象接口:

module Game.Core {
    export interface IObject {}

    export interface IManagedObject extends IObject{
        getKeyInManager(key: string): string;
        setKeyInManager(key: string): IObject;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是里面的代码getKeyInManager并且setKeyInManager不会改变,我想重用它,而不是复制它,这里是实现:

export class ObjectThatShouldAlsoBeExtended{
    private _keyInManager: string;

    public getKeyInManager(key: string): string{
        return this._keyInManager;
    }

    public setKeyInManager(key: string): DisplayObject{
        this._keyInManager = key;
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是通过a自动添加Manager.add()管理器中使用的键,以在其属性中引用对象本身内的对象_keyInManager.

那么,让我们以纹理为例.这就是了TextureManager

module Game.Managers {
    export class TextureManager extends Game.Managers.Manager {

        public createFromLocalImage(name: string, relativePath: string): Game.Core.Texture{
            return this.add(name, Game.Core.Texture.fromImage("/" + …
Run Code Online (Sandbox Code Playgroud)

javascript oop extends typescript

54
推荐指数
6
解决办法
6万
查看次数

赞成合成而不是继承

赞成合成而不是继承

是非常流行的短语.我读了几篇文章,最后每篇文章都说

当类之间存在纯粹的IS-A关系时使用继承.

本文的一个例子:

Apple和Fruit之间存在明显的IS-A关系,即Apple IS-A Fruit,但作者还将其显示为Apple HAS-A Fruit(组合),以显示继承实现时的陷阱.

我在这里有些困惑,声明的含义是什么

当类之间存在纯粹的IS-A关系时使用继承.

使用组合而不是继承是否意味着即使存在纯粹的IS-A关系也总是尝试应用组合, 并且只为那些组合没有意义的情况留下继承?

java inheritance design-patterns

53
推荐指数
2
解决办法
3万
查看次数

具有非虚析构函数的派生类

在某种情况下,派生类是否合法拥有非virtual析构函数?非virtual析构函数表示不应将类用作基类.具有virtual派生类的非析构函数是否会像Java final修饰符的弱形式一样?

我特别感兴趣的是派生类的基类有一个virtual析构函数.

c++

49
推荐指数
4
解决办法
6万
查看次数

内部抽象类:如何隐藏程序集外的用法?

我有一个公共程序集/项目,它有一个抽象基类,然后是几个我想公开给其他程序集的派生类.

我不希望抽象基类出现在Intellisense中的这些其他程序集中,所以我想我会成功internal,但是我得到了这个错误:

可访问性不一致:基类"设置"比"IrcSettings"类更难访问....

我真的不明白.我被迫制作抽象Settings类public,因此在这个程序集之外可见.

我怎样才能成为这门课internal呢?

c# inheritance abstract-class access-modifiers

48
推荐指数
4
解决办法
2万
查看次数

何时使用委托而不是继承?

有人可以解释我什么时候想使用委托而不是继承?

oop inheritance delegation

47
推荐指数
2
解决办法
2万
查看次数

未初始化的原始实例变量是否使用内存?

在Java中,在没有初始化的情况下声明类级实例变量会花费内存吗?
例如:int i;如果我没有初始化它,是否使用任何内存i = 5;?

细节:

我有一个巨大的超级类,许多不同的(没有足够的不同,有自己的超类)子类扩展.一些子类不使用超类声明的每个单元.我可以简单地将这些原语保留为未初始化,并仅在必要的子类中初始化它们以节省内存吗?

java primitive memory-management initialization

42
推荐指数
4
解决办法
5630
查看次数

如何通过使用超类来减少代码?

我想重构一些目前由超类和两个子类组成的代码.

这些是我的课程:

public class Animal {
    int a;
    int b;
    int c;
}

public class Dog extends Animal {
    int d;
    int e;
}

public class Cat extends Animal {
    int f; 
    int g;
}
Run Code Online (Sandbox Code Playgroud)

这是我目前的代码:

ArrayList<Animal> listAnimal = new ArrayList<>();

if (condition) {
    Dog dog = new Dog();
    dog.setA(..);
    dog.setB(..);
    dog.setC(..);
    dog.setD(..);
    dog.setE(..);   
    listAnimal.add(dog);

} else {
    Cat cat = new Cat();
    cat.setA(..);
    cat.setB(..);
    cat.setC(..);
    cat.setF(..);
    cat.setG(..);
    listAnimal.add(cat);
}
Run Code Online (Sandbox Code Playgroud)

如何重构有关公共属性的代码?

我想要这样的东西:

Animal animal = new Animal();
animal.setA(..);
animal.setB(..);
animal.setC(..); …
Run Code Online (Sandbox Code Playgroud)

java inheritance subclass superclass

39
推荐指数
3
解决办法
1868
查看次数

对字段和方法使用private而不是protected的原因

这是一个相当基本的OO问题,但是一段时间以来一直困扰着我.

我倾向于避免使用'private'可见性修饰符来支持我的字段和方法protected.

这是因为,一般来说,我没有看到在基类和子类之间隐藏实现的任何用法,除非我想为我的类的扩展设置特定的指导(即在框架中).对于大多数情况,我认为试图限制我的课程将由我或其他用户扩展是不利的.

但是,对于大多数人来说,private修饰符通常是定义非公共字段/方法时的默认选择.

那么,你可以列出用例private吗?总是使用私有的主要原因是什么?或者您是否也认为它过度使用?

oop visibility private protected

36
推荐指数
2
解决办法
1万
查看次数

为什么要避免使用子类型?

我看到Scala社区中有很多人建议避免像"瘟疫一样"进行分类.使用子类型的各种原因是什么?有哪些替代方案?

oop programming-languages functional-programming scala

34
推荐指数
3
解决办法
3637
查看次数

真的需要继承吗?

我必须承认我有点像OOP怀疑论者.面向对象的不良教学和实验经验无济于事.所以我转变成了Visual Basic中的狂热信徒(经典之作!).

然后有一天我发现C++已经改变了,现在有了STL和模板.我真的很喜欢!使语言有用.然后另一天MS决定对VB进行面部手术,我真的很讨厌无端更改的最终结果(使用"end while"而不是"wend"会让我成为一个更好的开发者?为什么不放下"next"for"结束了",为什么呢?为什么强迫getter和setter一起?等等?加上我发现无用的Java特性(例如继承,以及分层框架的概念).

现在,几年后,我发现自己在问这个哲学问题:遗产真的需要吗?

四人一组说我们应该支持对象组合而不是继承.在考虑它之后,我找不到你可以用继承做的事情,你不能用对象聚合和接口做.所以我想知道,为什么我们甚至在第一时间拥有它?

有任何想法吗?我很想看到一个例子,说明继承器肯定需要在哪里,或者使用继承而不是组合+接口可以导致更简单和更容易修改的设计.在以前的工作中,我发现如果你需要更改基类,你还需要修改几乎所有的派生类,因为它们取决于父行为.如果你使基类'方法虚拟...那么没有太多的代码共享发生:(

另外,当我最终创建自己的编程语言(我发现大多数开发人员共享的长期未满足的愿望)时,我认为添加继承没有任何意义......

oop inheritance

32
推荐指数
6
解决办法
6631
查看次数