我有一个Java类,它会触发自定义Java事件。该代码的结构如下:
public class AEvent extends EventObject {
...
}
public interface AListener extends EventListener {
public void event1(AEvent event);
}
public class A {
public synchronized void addAListener(AListener l) {
..
}
public synchronized void removeAListener(AListener l) {
..
}
protected void fireAListenerEvent1(AEvent event) {
..
}
}
一切正常,但是我想创建一个新的A类(称为B),这可能会引发一个新事件。我正在考虑以下修改:
public class BEvent extends AEvent {
...
}
public interface BListener extends AListener {
public void event2(BEvent event);
}
public class B extends A {
public synchronized void addBListener(BListener l) {
..
}
public synchronized void removeBListener(BListener l) {
..
}
protected void fireBListenerEvent2(AEvent event) {
..
}
}
这是正确的方法吗?我在网上搜索示例,但找不到任何示例。
在此解决方案中,有几件事我我不喜欢:
BListener
有两种方法,一种使用AEvent
另一种方法BEvent
作为参数。B
类都具有addAListener
和addBListener
方法。是否应该使用private关键字隐藏addAListener? [更新:无法使用私人关键字隐藏]fireAListenerEvent1
和fireBListenerEvent1
方法存在类似问题。我正在使用Java版本1.5。
我看不出为什么BListener
要延长的理由AListener
。
您是否真的要强迫每个对B
事件感兴趣的人也实施event1()
?
同样,您也不能添加addAListener()
,因为派生类无法降低父类中存在的方法的可见性。另外,您不需要这样做,否则会违反Liskov替换原则(每个B必须能够做A可以做的一切)。
最后,我要对fire*()
方法进行保护。通常没有任何理由让他们保持公开状态,减少公共成员的数量可以使您的公共界面保持整洁。
FAQs in section [24]: [24.1] 如何表示“私有继承”? [24.2] 私有继承和组合(composition)有什么类似? [24.3] 我应该选谁:组合还是私有继承? [24.4] 从私有继承类到父类需要指针类型转换吗? [24.5] 保护继承和私有继承的关系是什么? [24.6] 私有继承和保护继承的访问规则是什么? 24.1 如何表示“私有继承”? 用 : priv
问题内容: 假设Java具有以下层次结构类: 这是C#中相同代码的(盲)重复: 当我执行Java代码时,我得到了C#返回的信息。 对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。 Java设计者决定打印而不是打印的逻辑是什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么? 如何更改Java代码以像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方
有人能解释我这里发生了什么,为什么? 此代码的输出将是3 3,3,3。 如果我只用 getter 取消注释第 1 行,输出将是 3 2、2、2。 如果我只用setter取消对第2行的注释,输出将是1 1,1,1。 如果我取消对第1行和第2行的注释(用setter和getter),输出将是1 3,3,3。 如果用子类中的代码覆盖父类中的方法,则该覆盖方法不能访问私有成员变量,即使父类中被覆盖的方法可
一个类可以从另一个类继承方法、属性和其他的特性。当一个类从另一个类继承的时候,继承的类就是所谓的子类,而这个类继承的类被称为父类。在 Swift 中,继承与其他类型不同的基础分类行为。 在 Swift 中类可以调用和访问属于它们父类的方法、属性和下标脚本,并且可以提供它们自己重写的方法,属性和下标脚本来定义或修改它们的行为。Swift 会通过检查重写定义都有一个与之匹配的父类定义来确保你的重写是正
本页包含内容: 定义一个基类(Base class) 子类生成(Subclassing) 重写(Overriding) 防止重写 一个类可以继承(inherit)另一个类的方法(methods),属性(property)和其它特性。当一个类继承其它类时,继承类叫子类(subclass),被继承类叫超类(或父类,superclass)。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。
构造函数的继承 __proto__属性 属性的继承 对象的原生属性 对象的继承属性 获取所有属性 对象的拷贝 参考链接 构造函数的继承 JavaScript通过构造函数生成实例对象,所以要实现对象的继承,就是要实现构造函数的继承。 假定有一个Shape构造函数。 function Shape() { this.x = 0; this.y = 0; } Shape.prototype.mo
目标 了解类分层结构的概念 了解实现构造方法的各种方式 了解何时和为什么使用抽象类和方法 了解如何将一个引用从一个类赋给一个类型属于另一个类的变量。 继承的工作原理 Java 代码中的类存在于分层结构中。分层结构中的给定类上方的类是该类的超类。这个特定的类是分层结构中每个更高层的类的子类。子类继承它的超类。java.lang.Object 类位于类分层结构的顶部 — 所以每个 Java 类是 Ob
主要内容:多继承下的构造函数,命名冲突在前面的例子中,派生类都只有一个基类,称为 单继承(Single Inheritance)。除此之外, C++也支持 多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、 C#、 PHP 等干脆取消了多继承。 多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A