我何时应该使用接口,何时应该使用基类?
如果我不想实际定义方法的基本实现,它应该始终是一个接口吗?
如果我有狗和猫类.为什么我要实现IPet而不是PetBase?我可以理解有ISheds或IBarks(IMakesNoise?)的接口,因为那些可以基于宠物放在宠物上,但我不明白哪个用于通用Pet.
这可能是一个通用的OOP问题.我想根据它们的用法在接口和抽象类之间进行一般性比较.
什么时候想要使用接口?何时想要使用抽象类?
PMD将报告违规行为:
ArrayList<Object> list = new ArrayList<Object>();
Run Code Online (Sandbox Code Playgroud)
违规是"避免使用像'ArrayList'这样的实现类型;而是使用接口".
以下行将更正违规行为:
List<Object> list = new ArrayList<Object>();
Run Code Online (Sandbox Code Playgroud)
为什么要使用后者List而不是ArrayList?
阅读其他人的代码,我见过很多:
List<E> ints = new ArrayList<E>();
Map<K, V> map = new HashMap<K, V>();
Run Code Online (Sandbox Code Playgroud)
我的问题是:以这种方式实例化它们的意义/优势是什么,而不是:
ArrayList<E> ints = new ArrayList<E>();
HashMap<K, V> map = new HashMap<K, V>();
Run Code Online (Sandbox Code Playgroud)
令人感到奇怪的是,我从未见过如下:
CharSequence s = new String("String");
Run Code Online (Sandbox Code Playgroud)
要么
OutputStream out = new PrintStream(OutputStream);
Run Code Online (Sandbox Code Playgroud)
重复(问题的第一部分):