我需要在我的框架中添加看起来像这样的新功能:
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{}
这会导致多重继承。在没有太多代码重复的情况下需要新设计方面的帮助。
答案 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;接口,是一个类(可能是抽象的),多重复继承的问题将导致编译错误。
干杯。