假设我有一个名为Task的类。我想为它添加一些额外的功能,所以我扩展它。我这样做是通过创建一个扩展Task的类。
public class TaskHelper extends Task
{
public void getName()
{
....
}
// more additional functionality
}
所以,我开始使用它,当我有一个任务对象,并向下转换为TaskHelper时,我得到一个ClassCastException。所以我明白我不能贬低,我尝试创建类似
的复制构造public class TaskHelper extends Task
{
TaskHelper(Task t)
{
Task(t);
}
}
但是,Task没有复制构造函数,我无法修改Task,因为它是第三方类。我该怎么办?
答案 0 :(得分:4)
我无法修改任务,因为它是第三方类
Task
是外部依赖项。不是扩展它,而是抽象它。像这样:
public class TaskHelper
{
private Task task;
public TaskHelper() {
task = new Task();
}
// expose methods to delegate functionality to the private member
}
这会将您的代码与第三方代码分离。这带来了许多好处:
TaskHelper
实现一个可以轻松模拟单元测试或与其他任务实现交换的界面答案 1 :(得分:1)
如果我理解你的问题是正确的,你在代码中的某个地方有一个Task对象,并希望通过扩展Task类本身来为它提供一些额外的功能。对我而言,听起来你需要某种包装类。我会像这样创建TaskHelper:
public class TaskHelper {
private Task taskObject;
private String name;
//Additional variables
public TaskHelper(Task t) {
taskObject = t;
}
public Task getTaskObject() {
return taskObject;
}
//Setters, Getters and other methods working on the Task
object and additional variables
}
现在,您可以通过Getter访问Task对象并正常使用它,您可以使用新提供的方法处理Task对象。
如果您需要将TaskHelper作为普通的Task对象进行处理,则需要扩展Task类,但这也很容易。只需在编写时创建TaskHelper类,并调用super()方法(调用超类构造函数..)而不是Task(t)。确保在TaskHelper构造函数中提供Task构造函数所需的所有信息。
我希望对你有所帮助。
答案 2 :(得分:0)
更好的设计是使用构图。
public class TaskHelper { Task task; }
您可以使用此方法使用任何类型的任务。
这里,Task必须是一个界面。
答案 3 :(得分:0)
根据您的问题,Class Task
是第三方课程,您无法更改其实施。您是否尝试过扩展Task
之后是否能够从TaskHelper
“看到”Task
的方法?
class TaskHelper extends Task
{
}
上面的代码将隐式地从Task转换为TaskHelper的所有方法和成员。所以你不需要显式/手动尝试扩展超类的方法。
您还提到了Class Task中没有构造函数。但是,始终存在一个默认的空构造函数,它不接受任何参数。
添加内容:如果您需要访问任何超级类成员或从超类调用构造函数,您可以使用super
关键字。
使用“超级”的示例:
class A //A is super Class
{
private int a;
public A(int a)
{
this.a = a;
}
}
class B extends A //B is sub Class
{
private int b;
public B(int a, int b) //a inherited from Class A
{
super(a); //use "super" to call the constructor from super class
this.b = b;
}
}