在构造函数中调用可覆盖的方法

时间:2013-07-15 01:12:25

标签: java interface

我有一个对象的多个不同实现,它实现了我调用interface的自定义Board

Board包含一个类似于以下内容的方法

public void ConvertFromString(String formattedString);

每个实现Board的对象在其构造函数中调用ConvertFromString()

如下所示。

public void BoardImpl1 implements Board
{
    public Board(string B)
    {
        ConvertFromString(b);
    }

    public void ConvertFromString(String formattedString)
    {
        //do some parsing on string and set up the BoardImpl properties
    }
}

ConvertFromString为public会导致警告,因此我找到的解决方法之一就是使BoardImpl成为最终版本。有没有更好的方法来解决这个问题?

3 个答案:

答案 0 :(得分:2)

  

//对字符串进行一些解析并设置BoardImpl属性

该方法应该只负责convertFromString。

1)使方法最终

public class BoardImpl implements Board{

  public void final convertFromString(String formattedString)
  {
        //do some parsing on string and set up the BoardImpl properties
  }

}

2)解决方案生成abstract class并调用superClass构造函数,这样就不必调用每个子类但是不要使用子类中的属性,因为它们没有被使用

public abstract class AbstractBoard implements Board{

     public AbstractBoard(String s){
       convertFromString(s);
     }

}

3)而我喜欢的一个人用构图制作东西

public class Client {

 private Board board;

  public Client(String s){
   board.convertFromString(s);
  }

 public void setBoard(Board board){
      this.board = board;
 } 

}

然后在董事会中,您可以将决定董事会的责任委托给工厂,或者如果没有州{a}}

答案 1 :(得分:1)

ConvertFromString真的属于Board界面吗?如果您有一个以不同方式初始化其属性的板,该怎么办?如果可以,我会考虑重构董事会课程。

public class Board {
   public Board(Properties properties) {...}
}

我认为你在没有调用公共ConvertFromString方法的情况下设置它的原因是因为设计有点偏差。 ConvertFromString对其实现做出了假设。

答案 2 :(得分:0)

  1. 您的代码中存在编译错误
  2. 我无法通过以下代码获得编译警告

    public interface Board {
    
      public void ConvertFromString(String formattedString);
    
    }
    
    
    public class BoardImpl1 implements Board {
    
      public BoardImpl1(String b) {
    
        ConvertFromString(b);
    
      }
    
      public void ConvertFromString(String formattedString) {
    
        //bla bla
    
      }
    
    }