gpt4 book ai didi

java - 向 Java 类库添加函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:19:32 24 4
gpt4 key购买 nike

我使用的 Java 类库在很多方面都不完整:我觉得有很多类应该内置额外的成​​员函数。但是,我不确定添加这些成员函数的最佳实践。

让我们调用不足的基类A

class A
{
public A(/*long arbitrary arguments*/)
{
//...
}

public A(/*long even more arbitrary arguments*/)
{
//...
}

public int func()
{
return 1;
}
}

理想情况下,我想向A 添加一个函数。但是,我不能那样做。我的选择是:

class B extends A
{
//Implement ALL of A's constructors here

public int reallyUsefulFunction()
{
return func()+1;
}
}

class AddedFuncs
{
public static int reallyUsefulFunction(A a)
{
return a.func()+1;
}
}

在我看来,它们各有优缺点。第一种选择的语法比第二种更清晰,也更符合逻辑,但存在问题:假设我在类库中有第三个类 C

class C
{
public A func()
{
return new A(/*...*/);
}
}

在我看来,没有简单的方法可以做到这一点:

C c;
int useful = c.func().reallyUsefulFunction();

因为 C.func() 返回的类型是 A,而不是 B,您不能向下转换.

那么向只读库类添加成员函数的最佳方式是什么?

最佳答案

自然而频繁的困境。阅读有关 composition vs inheritance 替代方案的信息。你的第二个选择基本上是一个组合,如果我们认为对象 A 是在构造函数中传递而不是在每个方法中传递它 - 也就是说,我们将使用组合来实现 wrapperdecorator 模式.

类 C 返回类 A 的新实例的问题没有简单的解决方案,正如您猜想的那样,只要类 C 决定承担创建新实例的责任。这就是为什么在类中输入"new"语句之前应该停下来思考一下,如果这个类有可能被子类化的话。在你的例子中,如果你能告诉 C 类要返回哪个具体类就好了……但是它怎么知道要创建它呢?好吧,我们可以向他传递一个知道如何实例化 A 类(或子类)对象的对象……我猜你现在有足够的动力去阅读关于 Factories 的内容,以及一般的设计模式。

没有唯一的最佳答案,但如果想要一个快速的答案:我会做一个包装器,B 类不扩展 A 但有一个以 A 作为参数的构造函数,它将它的方法(除了自己的)委托(delegate)给内部对象。当你需要调用 C 类中的方法时(我假设你不能接触 C 类),你可以这样写:B b = new B(c.func())

关于java - 向 Java 类库添加函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2761172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com