我最近接受过两次电话采访,其中我被问及接口和抽象类之间的区别.我已经解释了他能想到的每一个方面,但似乎他们在等我提一些具体的东西,我不知道它是什么.
根据我的经验,我认为以下是正确的.如果我错过了重点,请告诉我.
接口:
在接口中声明的每个单独的方法都必须在子类中实现.接口中只能存在事件,代理,属性(C#)和方法.一个类可以实现多个接口.
抽象类:
只有抽象方法必须由子类实现.Abstract类可以有实现的常规方法.Abstract类还可以在Events,Delegates,Properties和Methods旁边有类变量.由于C#中不存在多重继承,因此类只能实现一个抽象类.
毕竟,面试官想出了一个问题"如果你有一个只有抽象方法的抽象类怎么办?那么它与界面会有什么不同?" 我不知道答案,但我认为这是上面提到的继承权吗?
另一位采访者问我,如果你在界面中有一个Public变量,那么它与Abstract Class有什么不同?我坚持认为你不能在界面中有一个公共变量.我不知道他想听到什么,但他也不满意.
另见:
如何使用PHPUnit测试抽象类的具体方法?
我希望我必须创建某种对象作为测试的一部分.虽然,我不知道最好的做法,或者如果PHPUnit允许这样做.
我是JUnit的Java测试新手.我必须使用Java,我想使用单元测试.
我的问题是:我有一个带有一些抽象方法的抽象类.但是有些方法并不是抽象的.如何使用JUnit测试此类?示例代码(非常简单):
abstract class Car {
public Car(int speed, int fuel) {
this.speed = speed;
this.fuel = fuel;
}
private int speed;
private int fuel;
abstract void drive();
public int getSpeed() {
return this.speed;
}
public int getFuel() {
return this.fuel;
}
}
Run Code Online (Sandbox Code Playgroud)
我想测试getSpeed()和getFuel()功能.
这个问题的类似问题在这里,但它没有使用JUnit.
在JUnit FAQ部分中,我找到了这个链接,但我不明白作者想用这个例子说些什么.这行代码是什么意思?
public abstract Source getSource() ;
Run Code Online (Sandbox Code Playgroud) 我对Java 8中引入的接口中的默认方法实现感到有些困惑.我想知道是否应该专门为接口及其实现的方法编写JUnit测试.我试着谷歌,但我找不到一些指导方针.请指教.
我用Java开发了很多代码,并涉足Groovy和Haskell,现在我已经把我带到了Scala.
我对Scala的功能方面感到相对舒服,但我发现自己在Scala中的面向对象设计上有些不稳定,因为它感觉与Java有点不同,特别是由于特性/混合.
我的目标是编写尽可能可测试的代码,这在我的Java开发中一直都是关注的
现在我正试图在这个新的Scala领域站起来,我很难弄清楚我应该采取什么方法,特别是我是否应该为某些目的开始使用继承.
编程Scala(Wampler和Payne; O'Reilly,第2版)有一个考虑因素("良好的面向对象设计:一个题外话"),我已经阅读了很多关于SO的帖子,但我还没有看到明确提到可测试性的设计考虑因素.本书提供了有关使用继承的建议:
- 抽象基类或特征由具体类(包括案例类)分为一级.
- 除了两种情况外,具体类永远不会被子类化:
- 混合在特征中定义的其他行为的类(...)
- 仅测试版本,以促进自动化单元投影.
- 当子类化似乎是正确的方法时,考虑将行为划分为特征并改为混合这些特征.
- 永远不要跨父子类型边界拆分逻辑状态.
对SO的一些挖掘也表明,有时混合比组合更好.
所以本质上我有两个问题:
是否有一些常见的情况,即使考虑可测试性,使用继承会更好?
混合是否提供了增强代码可测试性的好方法?