我希望节省我的时间,并在扩展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) 赞成合成而不是继承
是非常流行的短语.我读了几篇文章,最后每篇文章都说
当类之间存在纯粹的IS-A关系时使用继承.
本文的一个例子:
Apple和Fruit之间存在明显的IS-A关系,即Apple IS-A Fruit,但作者还将其显示为Apple HAS-A Fruit(组合),以显示继承实现时的陷阱.
我在这里有些困惑,声明的含义是什么
当类之间存在纯粹的IS-A关系时使用继承.
使用组合而不是继承是否意味着即使存在纯粹的IS-A关系也总是尝试应用组合, 并且只为那些组合没有意义的情况留下继承?
在某种情况下,派生类是否合法拥有非virtual析构函数?非virtual析构函数表示不应将类用作基类.具有virtual派生类的非析构函数是否会像Java final修饰符的弱形式一样?
我特别感兴趣的是派生类的基类有一个virtual析构函数.
我有一个公共程序集/项目,它有一个抽象基类,然后是几个我想公开给其他程序集的派生类.
我不希望抽象基类出现在Intellisense中的这些其他程序集中,所以我想我会成功internal,但是我得到了这个错误:
可访问性不一致:基类"设置"比"IrcSettings"类更难访问....
我真的不明白.我被迫制作抽象Settings类public,因此在这个程序集之外可见.
我怎样才能成为这门课internal呢?
在Java中,在没有初始化的情况下声明类级实例变量会花费内存吗?
例如:int i;如果我没有初始化它,是否使用任何内存i = 5;?
细节:
我有一个巨大的超级类,许多不同的(没有足够的不同,有自己的超类)子类扩展.一些子类不使用超类声明的每个单元.我可以简单地将这些原语保留为未初始化,并仅在必要的子类中初始化它们以节省内存吗?
我想重构一些目前由超类和两个子类组成的代码.
这些是我的课程:
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) 这是一个相当基本的OO问题,但是一段时间以来一直困扰着我.
我倾向于避免使用'private'可见性修饰符来支持我的字段和方法protected.
这是因为,一般来说,我没有看到在基类和子类之间隐藏实现的任何用法,除非我想为我的类的扩展设置特定的指导(即在框架中).对于大多数情况,我认为试图限制我的课程将由我或其他用户扩展是不利的.
但是,对于大多数人来说,private修饰符通常是定义非公共字段/方法时的默认选择.
那么,你可以列出用例private吗?总是使用私有的主要原因是什么?或者您是否也认为它过度使用?
我看到Scala社区中有很多人建议避免像"瘟疫一样"进行分类.使用子类型的各种原因是什么?有哪些替代方案?
我必须承认我有点像OOP怀疑论者.面向对象的不良教学和实验经验无济于事.所以我转变成了Visual Basic中的狂热信徒(经典之作!).
然后有一天我发现C++已经改变了,现在有了STL和模板.我真的很喜欢!使语言有用.然后另一天MS决定对VB进行面部手术,我真的很讨厌无端更改的最终结果(使用"end while"而不是"wend"会让我成为一个更好的开发者?为什么不放下"next"for"结束了",为什么呢?为什么强迫getter和setter一起?等等?加上我发现无用的Java特性(例如继承,以及分层框架的概念).
现在,几年后,我发现自己在问这个哲学问题:遗产真的需要吗?
四人一组说我们应该支持对象组合而不是继承.在考虑它之后,我找不到你可以用继承做的事情,你不能用对象聚合和接口做.所以我想知道,为什么我们甚至在第一时间拥有它?
有任何想法吗?我很想看到一个例子,说明继承器肯定需要在哪里,或者使用继承而不是组合+接口可以导致更简单和更容易修改的设计.在以前的工作中,我发现如果你需要更改基类,你还需要修改几乎所有的派生类,因为它们取决于父行为.如果你使基类'方法虚拟...那么没有太多的代码共享发生:(
另外,当我最终创建自己的编程语言(我发现大多数开发人员共享的长期未满足的愿望)时,我认为添加继承没有任何意义......
inheritance ×5
oop ×5
java ×3
c# ×1
c++ ×1
delegation ×1
extends ×1
javascript ×1
primitive ×1
private ×1
protected ×1
scala ×1
subclass ×1
superclass ×1
typescript ×1
visibility ×1