来自界面的对象?怎么可能呢?

时间:2014-09-28 15:20:50

标签: java

我完成了这个任务我应该解决:创建一个类,其构造函数以CSV格式解析文本(现在不必担心转义和引用)。构造函数的第二个参数是后续搜索所依据的字段的名称 完成。假设该字段中的值是唯一的。该类应实现CSVSearch接口:

interface CSVSearch {
    CSVRecord find(String key); // returns null if nothing is found
}

interface CSVRecord {
    String getField(String name);
}

然后我有一个示例用法:

CSVSearch csvByName = new YourCSVSearch(
"ip,name,desc\n"+
"10.0.0.1,server1,Main Server\n"+
"10.0.0.5,server2,Backup Server\n",
"name");

csvByName.find("server2").getField("ip") -> "10.0.0.5"
csvByName.find("server9") -> null

整个代码应占用20-30行。

首先,让我感到困惑的是,通过实现CSVSearch接口,它应该返回CSVRecord对象。但是CSVRecord是一个界面,所以我不能将它作为一个对象,对吧?

其次,如果我要实现接口,我应该如何链接他们的方法(csvByName.find("server2").getField("ip"))?

我开始写我的解决方案:

public class CSVfinder {

public static void main(String[] args) {

    CSVparser csvByName = new CSVparser("ip,name,desc\n"
            + "10.49.1.4,server1,Main Server\n"
            + "10.52.5.1,server2,Backup Server\n", "name");
    }
}

class CSVparser implements CSVSearch, CSVRecord {

    String lines[];
    String keys[];
    String values[];

    public CSVparser(String text, String key_name) {
        lines = text.split("\n");
        keys = lines[0].split(",");
    }

    public String getField(String name) {
        // TODO Auto-generated method stub
        return null;
    }

    public CSVRecord find(String key) {
        // TODO Auto-generated method stub
        return null;
    }
}

interface CSVSearch {
    CSVRecord find(String key); // returns null if nothing is found
}

interface CSVRecord {
    String getField(String name);
}

我迷失在这里......你怎么解决它?

2 个答案:

答案 0 :(得分:2)

首先考虑接口:

当一个对象是一个实现接口的类时,它可以存储在接口类型的变量中。

例如,SomeInterface variable1 = new SomeInterfaceImplementation();完全有效。

但是,您必须记住,如果未在接口定义中声明(或继承)它们,则无法在变量中调用实现中定义的任何方法(甚至是公共方法)。

也就是说,除了接口定义之外,问题解决方案的一般结构如下:

public class MyCSVSearch implements CSVSearch {

    // Some constructor that would accept the file/text to parse and parse it with a good logic

    public CSVRecord find(String key) {

        MyCSVRecord record = new MyCSVRecord(); // Note this is your class that implements CSVRecord.

        // The logic to store the record details into the record object

        return record; // As said initially, it is ok to return an object of MyCSVRecord as it implements CSVRecord.
    }

}

public class MyCSVRecord implements CSVRecord {

    // May be you need some properties to store the data (perhaps a hash map).

    public String getField(String name) {
        // Return the relevant field from the properties
    }

}

至于链接 - 你是对的。只需拨打csvByName.find("server2").getField("ip")即可。

答案 1 :(得分:1)

看看样本,它说是YourCSVSearch。这就是Interfaces的重点,你班上的每个学生(你说这是一个作业)会想出自己解析CSV格式文件的方法,但是每个人都必须实现这两个接口,所以他们必须定义(覆盖) )2个函数:getField()和find()。

关键是当开发人员向另一个开发者提供任务时,他希望他给出一个他(第一个开发者)可以在他自己的程序中使用的结果...来简化它:你的老师可以写一个整个程序使用2个函数getField()和find()而不知道它们是如何工作的,只是因为他不需要,他希望你能使它们正确,然后期望结果他“被迫”。

现在回答“这怎么可能”......你需要了解抽象类和接口。虽然Interface可能看起来不是对象,但是当一个Class实现它时,接口内应该有一个抽象方法的定义,该类的实例是“那个接口”类型的对象,例如:

假设我正在开发一个与其他开发人员一起使用的几何应用程序,所以这里的一般想法是具有表面和周长的几何形式,但我希望其他开发人员来处理这些,所以,我做界面表格:

public interface Form {
  public double perimeter();
  public double surface();
}

所以第一个开发者决定制作Circle,所以他会这样做:

public class Circle implements Form {
 //as soon as u implement form any IDE would tell u to implement the abstract methods
  double r;

  public Circle(double r){
    this.r=r;
  }
  @Override //not necessary but this shows that you are defining the method now
  public double surface(){
   return Math.PI*r*r;
  }
  public double perimeter(){
  return 2*math.PI*r;
  }

现在第一个开发人员可以像这样创建Form类型的实例:

Form circle = new Circle(10);
System.out.println("the circle's surface is :"+circle.surface());

Form是接口,因此可以称为“type”,Circle是实现Form的Object然后它实际上是一个Form,所以Circle的任何实例也是一个Form,就像JAVA中的任何东西实际上都是一个Object

要将此应用于您的作业,您必须创建实现这些接口的类并以您自己的方式定义方法。至于你提到的链接

csvByName.find("server2").getField("ip")

csvByName是一个CSVSearch,然后方法find返回一个CSVRecord,而CSVRecord又定义了getField方法......这样才能正确使用。

现在关于界面,您可以阅读更多相关信息:here

关于如何制作解析器(查找记录和IP),你必须自己做,就像任何解析器一样,阅读文本或数据,找到关键字/字母......并检索数据,比如例如:

name: ali age: 21
name: X   age: 30

正如您在“name:”之后看到的那样,您具有“age:”的值和相同的值,您可以阅读该文件并搜索这些关键字。 您可以阅读有关解析CSV here

的信息

花点时间学习继承,因为它会在很久之后派上用场(这就是为什么我做了这么长的帖子:P),每次你使用Else的API时,你几乎要处理这个问题,祝你好运。