Eri*_*ric 6 java casting class function
我使用的Java类库在很多方面都是不完整的:我觉得应该有许多类内置其他成员函数.但是,我不确定添加这些成员函数的最佳实践.
让我们调用不充分的基类A.
class A
{
public A(/*long arbitrary arguments*/)
{
//...
}
public A(/*long even more arbitrary arguments*/)
{
//...
}
public int func()
{
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想添加一个函数A.但是,我做不到.我的选择是:
class B extends A
{
//Implement ALL of A's constructors here
public int reallyUsefulFunction()
{
return func()+1;
}
}
Run Code Online (Sandbox Code Playgroud)
和
class AddedFuncs
{
public static int reallyUsefulFunction(A a)
{
return a.func()+1;
}
}
Run Code Online (Sandbox Code Playgroud)
我看待它的方式,它们都有优点和缺点.第一种选择提供了比第二种更清晰的语法,并且更符合逻辑,但有问题:假设我C在类库中有第三类.
class C
{
public A func()
{
return new A(/*...*/);
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,没有简单的方法可以做到这一点:
C c;
int useful = c.func().reallyUsefulFunction();
Run Code Online (Sandbox Code Playgroud)
因为返回的类型C.func()是Aa B,而不是a ,并且你不能向下转换.
那么将成员函数添加到只读库类的最佳方法是什么?
自然且频繁的困境。了解组合与继承的替代方案。如果我们认为对象 A 在构造函数中传递而不是在每个方法中传递,那么您的第二种选择基本上是组合 - 也就是说,我们将使用组合来实现包装器 或装饰器模式。
正如您所猜测的,类 C 返回类 A 的新实例的问题没有简单的解决方案,只要类 C 决定承担创建新实例的责任。这就是为什么在类中键入“新”语句之前应该暂停并思考(如果该类有可能被子类化)。在您的示例中,如果您可以告诉 C 类返回什么具体类,那就太好了……但是它如何知道创建它呢?好吧,我们可以向他传递一个对象,该对象知道如何实例化 A 类(或子类)的对象...我想您现在有足够的动力去阅读工厂以及一般的设计模式。
没有唯一的最佳答案,但如果想要一个快速的答案:我会制作一个包装器,B 类不扩展 A 但有一个以 A 作为参数的构造函数,它将其方法(除了自己的方法)委托给内部对象。当您需要调用 C 类中的方法时(我假设您无法触及 C 类),您可以编写:B b = new B(c.func())
| 归档时间: |
|
| 查看次数: |
4993 次 |
| 最近记录: |