【问题标题】:Determine Subclass Type of an Object of the Parent Class确定父类对象的子类类型
【发布时间】:2013-06-08 23:50:26
【问题描述】:

我有这个问题,我的代码中有几个部分,我检查是否满足这些特定条件,以便我可以了解我正在检查的内容是一种类型还是另一种类型。这最终会变大 if else 树,因为我要进行大量检查,每种方法都进行相同的检查,并且我要检查的东西可能有几种不同的类型。我知道这可以使用对象来解决! 具体来说,我要检查的是文件中的 4 个字符串值。基于这些字符串值,4 个字符串一起可以构成 3 种类型之一。我不是每次需要获取 4 个字符串组成的类型时都进行这些相同的检查,而是想知道是否可以在给定这 4 个字符串的情况下创建一个通用对象,然后确定该对象是否是特定类 1、2、或 3. 然后我就可以将该通用对象转换为特定对象。

假设我将 4 个字符串创建的通用对象命名为 Sign。我会使用这 4 个字符串并创建一个新的 Sign 对象:

Sign unkownType = new Sign(string1, string2, string3, string4);

我需要检查这个标志是哪种特定类型的标志。

编辑: 有关更多详细信息,我正在检查的标志不是“+”或“-”之类的符号,它们是带有文字的标志,就像您在路上看到的那样。每个标志上有 4 行,需要检查它们以查看每行的计算结果是否与特定类型的标志匹配。 SignType1 的第一行与 SignType2 的第一行不同,我想将这 4 行(字符串)传递给一个对象,并在我的代码中使用该对象从中获取值,而不是制作相同的值检查每种方法。 如果你想让我展示一些代码,我可以,但它没有多大意义。

【问题讨论】:

  • 这太抽象了,无法给出一个好的答案。能举个具体的例子吗?

标签: java class oop object instanceof


【解决方案1】:

您似乎要求的是工厂模式

public interface ISign {
    public void operation1();
    public void operation2();

}

和一个基于输入生成类的工厂类

public class SignGenerator {
    public static ISign getSignObject(String str1,String str2, String str3, String str4) {
        if(str1.equals("blah blah"))
           return new FirstType();
        if(str1.equals("blah blah2") && str2.equals("lorem ipsum"))
           return new SecondType();
        return new ThirdType();
    }
}

public class FirstType implements ISign {
}

public class SecondType implements ISign {
}

public class ThirdType implements ISign {
}

在这些类中实现所有类型特定的逻辑,这样您就可以在不首先检查大量 if..else 子句的情况下调用它们

【讨论】:

  • 仅供参考,return 后没有“else” - 您可以在不改变执行方式的情况下删除所有此类 else。
  • 你的意思是说,我应该使用一系列的if条件吗?有道理。
  • 哇....我已经编码了一整天,我的头脑是糊状的。我不敢相信我没有意识到这一点!前几天我实际上正在阅读许多不同的设计模式,并阅读了几种不同的工厂模式!我应该知道的更好!谢谢你!我现在不会忘记的!
  • 我编辑了你的答案以表明你想要我的意思 - 即我删除了所有的“elde”。当执行以“if”终止时,没有“else”
【解决方案2】:

根据我从您的陈述中收集到的信息。 说:如果给定的字符串等于您指定的whateva值,则创建返回某个对象的方法

    //provided the objects to be returned are subtypes of Sign
    public Sign getInstance(String first, String second, String third, String fourth)
    {

        if(first==null || second==null || third==null || fourth===null )
            return null;

      if(compare1.equals(first))
       return new SignType1();
      else
      if(compare2.equals(second))
       return new SignType2();
      else  
      if(compare3.equals(third))
       return new SignType3();
      else
      if(compare4.equals(fourth))
       return new SignType4();

    }

上面的代码检查并返回与传递的字符串对应的适当实例 希望这就是您所关心的

【讨论】:

  • else 语句是多余的。您可能的意思是要返回的对象是 Sign 的实现,而不是子类型(java 中没有子类型——有实现和特化)。
  • 是的,你说得对,它们是多余的,但在这个线程中,冗余并不重要吗?
  • 你的意思是java中没有子类型?java如何支持子类型但没有子类型,它只是术语Dollery.....“所有类都是类Object的子类型”, subclass-subtype-childclass-baseclass-specializations 都指同一个东西...
  • 子类型必须是从属。实现一个接口不会给你从属关系。您可能会争辩说,在特定情况下,在扩展类时已经创建了从属关系,但这是一个特定于应用程序的概念。在 java 中,子类不是从属,而是专门化。
  • 是的,我知道他们在 jls 中使用了这个词,我只是碰巧认为他们这样做是错误的,应该更明确地说明实际情况。
猜你喜欢
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
相关资源
最近更新 更多