【问题标题】:When to choose a interface or Subclass [duplicate]何时选择接口或子类 [重复]
【发布时间】:2016-06-26 18:54:16
【问题描述】:

所以,我有这个讲座,我正在准备考试。我必须编写代码,以便我的代码通过每个 Junit 测试。 我一直不知道如何弄清楚的一件事是,我什么时候应该使用接口或子类......

谁能告诉我如何根据 Junit 测试决定使用哪个?

我有一辆火车,有两种类型的火车:TGV 和 Pendular

P.S 我知道测试名称明确表示子类,但忽略它...

公共类 RailRoadTests {

@Test
public void testTrain() {
    Train c1 = new Train("Regional");
    assertEquals("Regional", c1.getName()); 

    Train c2 = new Train("Intercidades");
    assertEquals("Intercidades", c2.getName()); 
}

@Test
public void testSubclassesTrain() {     
    Train tgv = new TGV("Speeder");
    assertEquals("Speeder", tgv.getNome());

    Train pendular = new Pendular("Alfa Pendular");
    assertEquals("Alfa Pendular", pendular.getNome());
}

【问题讨论】:

  • 使用接口或子类是完全不同的两件事,目的也完全不同。我不明白你想问什么。
  • 任何一个都可以在这里工作。
  • 我也不明白这个问题。关键是:无论如何你确实需要子类;因为您必须使用“新”创建一些对象。现在;如果您分配像InterfaceName myvar = new(... 这样创建的对象,或者如果您这样做SubclassName myvar = new... 只是一个微妙的细节。并且 - 一般无法回答两个版本中哪个“更好”的决定。这样的问题真的只有在具有真实需求的“真实”问题的背景下才有意义。
  • 您可以使用这个经验法则:如果您需要所有子类之间的共同行为,请使用基本抽象类。另一方面,如果没有默认行为,我们使用一个接口。但是,如果您使用的是 Java 8,则可以使用具有默认方法实现的接口,因此您可以选择两者。

标签: java


【解决方案1】:

如果两种类型的列车具有相似的功能或代码,则最好使用子类。 接口允许相同的方法签名,但不包含实际代码(除非您使用的是 java 8)。

【讨论】:

    【解决方案2】:

    接口确保实现它的每个类都具有相同的方法签名(命名和参数)。对于这些方法签名,每个类可能具有完全不同的代码实现。尽管理论上它们可以共享,但它们不一定共享任何代码。

    子类化时,您可以从基类共享代码。您还可以通过在方法中调用 super([parameters]) 来构建基本功能。或者,您可以使用子类范围内的基本方法(受保护的、公共的等)中的现有功能。

    When to implement an interface and when to extend a superclass? 可能重复

    【讨论】:

      【解决方案3】:

      如果子类想要扩展两个或多个类(多重继承),则使用接口,如果您只扩展子类中的一个类,则使用继承(子类)功能。

      【讨论】:

        猜你喜欢
        • 2011-03-28
        • 2012-08-07
        • 1970-01-01
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        • 2013-03-15
        • 2018-09-28
        相关资源
        最近更新 更多