扩展类功能的最佳方法是什么?

时间:2014-09-22 17:32:19

标签: java oop classcastexception

假设我有一个名为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,因为它是第三方类。我该怎么办?

4 个答案:

答案 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;
   }
}