具有新功能的向后兼容框架

时间:2014-03-19 00:25:15

标签: java oop class-design

我需要在我的框架中添加看起来像这样的新功能:

interface firstInterface{}

abstract class ReadOnly extends Forward{}

class Reference extends ReadOnly implements firstInterface{}

抽象类ReadOnly是通过抛出Forward来限制unsupportedaction的功能。 我现在需要支持这些功能,但在另一个类中(因此有两个选项)。

我的第一步是,

class baseReference implements firstInterface{}

abstract class ReadOnly extends Forward{}

class Reference extends baseReference, Readonly{}

class Loading extends baseReference, Forward{}

这会导致多重继承。在没有太多代码重复的情况下需要新设计方面的帮助。

2 个答案:

答案 0 :(得分:1)

赞成继承继承。通过委托(适配器模式)

包装具有不同实现的实现
public class ReadOnly implements Forward{

     private Forward delegate;

     public ReadOnly(Forward adaptee){
          //check for null here if you want
          this.delegate = adaptee;
     }

     public void loadFoo(Foo foo){
       //invalid since this is read-only
       //this is the exception mentioned in OP
       throw new UnsupportedAction():

     }


     public Foo readFoo(){
          //allowed return delegate's foo
          return delegate.readFoo();
     }

}

答案 1 :(得分:0)

似乎,您将接口实现与类实现混淆。

让我回答你的问题,使用基于文本的UML类图,而不是代码。请将点视为空白空间。

[1]您的框架有一个名为" FirstInterface"的接口,并且此接口定义了一个名为" Load"的方法,可能还有其他方法或属性。

.....................................
..+-------------------------------+..
..|.........<<interface>>.........|..
..|........FirstInterface.........|..
..+-------------------------------+..
..|.[+].void Load()...............|..
..+-------------------------------+..
.....................................

请注意&#34; +&#34;方括号内表示函数或属性可以作为&#34; public&#34;。

加入

[2]你的框架有一个名为&#34; ForwardClass&#34;支持&#34; FirstInterface&#34;。

因此,这个班级有自己的&#34; Load&#34;方法已实施。

.....................................
..+-------------------------------+..
..|.........<<interface>>.........|..
..|........FirstInterface.........|..
..+-------------------------------+..
..|.[+].void Load()...............|..
..+-------------------------------+..
..................|..................
................/---\................
................|.O.|................
..................|..................
..+-------------------------------+..
..|...........<<class>>...........|..
..|.........ForwardClass..........|..
..+-------------------------------+..
..|.[+].void Load()...<<virtual>>.|..
..+-------------------------------+..
.....................................

请注意,在Java中,与其他语言不同,所有方法都被视为&#34;虚拟&#34;,并且可以替换,而不指定任何内容。

我将使用&#34;虚拟&#34;第一次声明方法时的文本,&#34;覆盖&#34;文本,在图中,当一个方法已经存在,并被替换。

[3]现在,&#34; ForwardClass&#34;将其扩展为&#34; ReadOnlyClass&#34; class,取代&#34; Load&#34;方法,并引发一个异常,称为&#34; UnsupportedActionException&#34;,记住异常是一种特殊的类或对象。

&#34; ReadOnlyClass&#34;类,还添加一些额外的方法。

.....................................
..+-------------------------------+..
..|...........<<class>>...........|..
..|.........ForwardClass..........|..
..+-------------------------------+..
..|.[+].void Load()...<<virtual>>.|..
..+-------------------------------+..
..................|..................
..................^..................
................./.\.................
................/---\................
..................|...........................................................
..+---------------------------------+......+-------------------------------+..
..|............<<class>>............|...+--|.........<<exception>>.........|..
..|..........ReadOnlyClass..........|...|..|...UnsupportedActionException..|..
..+---------------------------------+...|..+-------------------------------+..
..|.[+].void Load()....<<override>>.|---+.....................................
..|.[+].void DoExtra()..<<virtual>>.|.........................................
..+---------------------------------+.........................................
..............................................................................

[4]现在,你想扩展&#34; ReadOnlyClass&#34;使用&#34; LoadingClass&#34;的类。让我们为它添加一些属性,或者替换&#34; DoExtra&#34;方法

..............................................................................
..+---------------------------------+......+-------------------------------+..
..|............<<class>>............|...+--|.........<<exception>>.........|..
..|..........ReadOnlyClass..........|...|..|...UnsupportedActionException..|..
..+---------------------------------+...|..+-------------------------------+..
..|.[+].void Load()....<<override>>.|---+.....................................
..|.[+].void DoExtra()..<<virtual>>.|.........................................
..+---------------------------------+.........................................
..................|..................
..................^..................
................./.\.................
................/---\................
..................|..................
..+----------------------------------+..
..|............<<class>>.............|..
..|...........LoadingClass...........|..
..+----------------------------------+..
..|.[+].void DoExtra()..<<override>>.|..
..+----------------------------------+..
........................................

[5]现在,让我们为你的帖子应用场景。

让我们说,你想要任何&#34; LoadingClass&#34;对象,也使用&#34;加载&#34; &#34; ForwardClass&#34;的方法父类,忽略&#34;加载&#34; &#34; ReadOnlyClass&#34;的方法父类,它会生成异常。

一种潜在的解决方案,它可以在&#34; ForwardClass&#34;中创建一个名为&#34; ConfirmedLoad&#34;等名称的新受保护方法。让我们添加一个包含&#34;#&#34;的框。性格,以明确其受保护的&#34;方法

移动&#34;加载&#34;的所有代码to&#34; ConfirmedLoad&#34;,然后,make&#34; Load&#34;执行&#34; ConfirmedLoad&#34;。

类的继承,继续相同,并且使用此类的其他代码不会受到更改的影响。请注意,我没有把&#34;虚拟&#34;文本到&#34; ConfirmedLoad&#34;,因为,我们对替换此方法不感兴趣。

............................................
..+---------------------------------------+..
..|...............<<class>>...............|..
..|.............ForwardClass..............|..
..+---------------------------------------+..
..|.[#].void ConfirmedLoad()..............|..
..|.[+].void Load()...........<<virtual>>.|..
..+---------------------------------------+..
.............................................

[6]然后,我们可以添加一个布尔值&#34; CanLoad&#34;方法,对于&#34; ReadOnlyClass&#34;,在这种情况下,总是返回false,但是,期望稍后更改。我们还改变了#34; Load&#34;这里的方法,调用&#34; CanLoad&#34;函数,如果asnwer为false,则生成异常。

............................................
..+---------------------------------------+..
..|...............<<class>>...............|..
..|.............ForwardClass..............|..
..+---------------------------------------+..
..|.[#].void ConfirmedLoad()..............|..
..|.[+].void Load()...........<<virtual>>.|..
..+---------------------------------------+..
..................|..................
..................^..................
................./.\.................
................/---\................
..................|..................
..+---------------------------------------+..
..|...............<<class>>...............|........+-------------------------------+..
..|.............ReadOnlyClass.............|.....+--|.........<<exception>>.........|..
..+---------------------------------------+.....|..|...UnsupportedActionException..|..
..|.[+].bool CanLoad()........<<virtual>>.|.....|..+-------------------------------+..
..|.[+].void Load()..........<<override>>.|..---+.....................................
..|.[+].void DoExtra()........<<virtual>>.|..
..+---------------------------------------+..
.............................................

[7]现在,在其他方面做出#34; Load&#34;方法可以在任何&#34; LoadingClass&#34;然后,让我们替换&#34; CanLoad&#34;方法,总是返回true。

.............................................
..+---------------------------------------+..
..|...............<<class>>...............|..
..|.............ForwardClass..............|..
..+---------------------------------------+..
..|.[#].void ConfirmedLoad()..............|..
..|.[+].void Load()...........<<virtual>>.|..
..+---------------------------------------+..
.......................|..................
.......................^..................
....................../.\.................
...................../---\................
.......................|..................
..+---------------------------------------+..
..|...............<<class>>...............|........+-------------------------------+..
..|.............ReadOnlyClass.............|.....+--|.........<<exception>>.........|..
..+---------------------------------------+.....|..|...UnsupportedActionException..|..
..|.[+].bool CanLoad()........<<virtual>>.|.....|..+-------------------------------+..
..|.[+].void Load()..........<<override>>.|..---+.....................................
..|.[+].void DoExtra()........<<virtual>>.|..
..+---------------------------------------+..
.......................|..................
.......................^..................
....................../.\.................
...................../---\................
.......................|..................
..+---------------------------------------+..
..|...............<<class>>...............|..
..|.............LoadingClass..............|..
..+---------------------------------------+..
..|.[+].bool CanLoad().......<<override>>.|..
..+---------------------------------------+..
.............................................

[8]如果添加其他类,实现&#34; LoadInterface&#34;,并且还是&#34; ForwardClass&#34;,&#34; ReadOnlyClass&#34;的子类。或&#34; LoadingClass&#34;类,这并不重要,因为一个接口可以被支持多次,接口只添加一个&#34;我期望这些&#34;东西,而不是真正的代码本身。

.............................................
..+---------------------------------------+..
..|...............<<class>>...............|..
..|............FirstInterface.............|..
..+---------------------------------------+..
..|.[+].void Load().......................|..
..+---------------------------------------+..
.......................|......................
...................../---\....................
.....................|.O.|........................
.......................|..........................
.......................+-----------------------+..
.......................|.......................|..
.......................|.......................|..
..+---------------------------------------+....|..
..|...............<<class>>...............|....|..
..|.............ForwardClass..............|....|..
..+---------------------------------------+....|..
..|.[#].void ConfirmedLoad()..............|....|..
..|.[+].void Load()...........<<virtual>>.|....|..
..+---------------------------------------+....|..
.......................|.......................|..
.......................^.......................|..
....................../.\......................|..
...................../---\.....................|..
.......................|.......................|..
..+---------------------------------------+....|..
..|...............<<class>>...............|....|..
..|.............ReadOnlyClass.............|....|..
..+---------------------------------------+....|..
..|.[+].bool CanLoad()........<<virtual>>.|....|..
..|.[+].void Load()..........<<override>>.|....|..
..|.[+].void DoExtra()........<<virtual>>.|....|..
..+---------------------------------------+....|..
.......................|.......................|..
.......................^.......................|..
....................../.\......................|..
...................../---\.....................|..
.......................|.......................|..
..+---------------------------------------+....|..
..|...............<<class>>...............|....|..
..|.............LoadingClass..............|....|..
..+---------------------------------------+....|..
..|.[+].bool CanLoad().......<<override>>.|....|..
..+---------------------------------------+....|..
.......................|.......................|..
.......................^.......................|..
....................../.\......................|..
...................../---\.....................|..
.......................|.......................|..
..+---------------------------------------+....|..
..|...............<<class>>...............|----+..
..|...........BaseReferenceClass..........|.......
..+---------------------------------------+.......
..................................................

&#34; BaseReferenceClass&#34; class实现间接的&#34; FirstInterface&#34;接口通过&#34; LoadingClass&#34; class,但是,也可以直接实现相同的接口。对接口来说没关系,但是,不是类。

如果,&#34; FirstInterface&#34;接口,是一个类(可能是抽象的),多重复继承的问题将导致编译错误。

干杯。