在一个面向对象的程序中: 多less抽象是太多了? 多less是正确的? 我一直是一个坚强的人。 我理解高级封装和抽象背后的概念,但总是感到本能地认为添加太多会混淆程序。 我总是试图拍摄一些抽象的东西,没有留下任何空的类或层。 而在有疑问的地方,我不会在层次结构中添加新的图层,而是尝试将某些东西放入现有图层中。 但是,最近我遇到了更高度抽象的系统。 系统中所有可能需要在层次结构中进行表示的事物都可以在前面find。 这导致了很多空的层次,最初看起来像糟糕的devise。 然而,第二个想法是,我已经意识到,留下那些空白的层让你有更多的地方在未来没有太多的重构。 它让你有更大的能力在老的基础上添加新的function,而不用做太多的工作来调整旧的function。 这两个风险似乎是你可以得到你需要的图层错误。 在这种情况下,人们仍然需要做大量的重构来扩展代码,并且仍然会有大量从未使用过的图层。 但是,取决于花费多less时间来提出最初的抽象概念,把它搞砸的可能性,以及如果得到正确的结果,以后可以节省的时间 – 可能还是值得去尝试。 我能想到的另一个风险就是过度做这件事的风险,而且从来不需要所有额外的层次。 但是那真的很糟糕? 额外的课程层次是否真的如此昂贵,以至于如果他们从未被使用过,那么这是多么的失败? 这里最大的开销和损失将是时间,这是失去了前面的层数。 但是,大部分时间仍然可以在以后使用抽象代码而不是更底层的代码来保存。 那么什么时候太多? 什么时候空的层和额外的“可能需要”抽象成为矫枉过正? 多less太less? 甜蜜点在哪里? 在你的职业生涯中,你有没有find可靠的经验法则来帮助你判断所需的抽象数量?
sealed abstract和abstract Scala类有什么区别?
这样的问题的答案: List <T>或IList <T>似乎总是认为返回一个接口比返回一个集合的具体实现更好。 但是我正在为此而苦苦挣扎。 实例化一个接口是不可能的,所以如果你的方法正在返回一个接口,它实际上还是返回一个特定的实现。 我正在通过编写两个小方法来进行一些尝试: public static IList<int> ExposeArrayIList() { return new[] { 1, 2, 3 }; } public static IList<int> ExposeListIList() { return new List<int> { 1, 2, 3 }; } 并在我的testing程序中使用它们: static void Main(string[] args) { IList<int> arrayIList = ExposeArrayIList(); IList<int> listIList = ExposeListIList(); //Will give a runtime error arrayIList.Add(10); //Runs […]
是否有可能在JavaScript中模拟抽象基类? 什么是最优雅的方式来做到这一点? 说,我想做一些事情: – var cat = new Animal('cat'); var dog = new Animal('dog'); cat.say(); dog.say(); 它应该输出:“树皮”,“喵”
通常在斯卡拉文学中,我遇到了“抽象结束”这个短语,但我不明白这个意图。 例如 ,Martin Odersky写道 你可以传递方法(或“函数”)作为参数,或者你可以抽象它们。 你可以指定types作为参数,或者你可以抽象它们。 又如,在“弃用观察者模式”论文中, 我们事件stream成为一stream价值的结果是我们可以对它们进行抽象 。 我已经读过第一类generics“抽象types”,而monad“抽象types构造函数”。 而且我们也在蛋糕模式纸上看到这样的短语。 引用许多这样的例子之一: 抽象types成员提供了对具体types的组件进行抽象的灵活方法。 甚至相关的堆栈溢出问题也使用这个术语。 “不能存在抽象的参数化types…” 那么……“抽象结束”究竟是什么意思呢?
你能告诉我软件开发中的抽象和信息隐藏有什么区别吗? 我很困惑。 抽象隐藏了详细的实现和信息隐藏摘要的东西的全部细节。 更新:我为这三个概念find了一个很好的答案。 请参阅下面的单独的答案 ,从那里引用几个引文。
我正在通过Jar文件中的类进行交互,并希望find那些不是抽象的。 我可以通过实例化类和捕获InstantiationException来解决这个问题,但是由于某些类的启动很大,所以性能会受到影响。 在Class.java文档中我找不到像isAbstract()那样明显的东西。
假设我有一个实现了Runnable接口的抽象Base类。 public abstract class Base implements Runnable { protected int param; public Base(final int param) { System.out.println("Base constructor"); this.param = param; // I'm using this param here new Thread(this).start(); System.out.println("Derivative thread created with param " + param); } @Override abstract public void run(); } 这是几个派生类之一。 public class Derivative extends Base { public Derivative(final int param) […]
最近我开始研究Java 8,我不能完全理解Java实现lambdaexpression式所必需的“function接口”的概念。 在Java中有一个非常全面的 lambda函数的指南 ,但是我陷入了定义函数接口概念的章节 。 定义如下: 更确切地说,一个function接口被定义为只有一个抽象方法的任何接口。 然后他继续举例,其中一个是“比较器”界面: public interface Comparator {int compare(T o1,T o2); boolean equals(Object obj); } 我能够testing,我可以使用lambda函数来代替Comparator参数,它的工作原理(即Collections.sort(list, (a, b) -> ab) )。 但是在Comparator接口中,compare()和equals()方法都是抽象的,这意味着它有两个抽象方法 。 那么如果定义需要一个接口只有一个抽象方法 ,那么这怎么可能呢? 我在这里错过了什么?
在哪种情况下,build议使用虚拟还是抽象? 哪一种更正确?