我知道在Java和C#中不允许多重inheritance。 很多书只是说,多重inheritance是不允许的。 但是可以通过使用接口来实现。 没有讨论为什么不被允许。 有谁能告诉我,为什么这是不允许的?
我被问了一个问题,我想在这里回答我的答案。 问:在哪种情况下,扩展抽象类而不是实现接口更合适? 答:如果我们使用模板方法devise模式。 我对么 ? 如果我无法清楚地说出问题,我感到抱歉。 我知道抽象类和接口的基本区别。 1)当需求是这样的时候,使用抽象类:我们需要在每个子类中为特定的操作(实现该方法)实现相同的function,并且为其他一些操作(只有方法签名) 2)使用接口,如果你需要把签名放在同一个(和实现不同),以便你可以遵守接口的实现 3)我们可以扩展一个抽象类的最大值,但可以实现多个接口 重申一个问题:除了上面提到的那些,还有没有其他的场景需要使用抽象类(一种是模板方法devise模式只是基于这个概念)? 接口与抽象类 在这两者之间进行select,取决于你想要做什么,但对我们来说幸运的是,Erich Gamma可以帮助我们一点。 和往常一样有一个权衡,一个接口给你基础类的自由 ,一个抽象类给你随后添加新方法的自由 。 – Erich Gamma 你不能去改变一个接口,而不必在你的代码中改变很多其他的东西 ,所以唯一的方法就是创build一个全新的接口,这可能不是一件好事。 Abstract classes应主要用于密切相关的对象。 Interfaces更好地为不相关的类提供通用的function。
我刚刚通过阅读StackOverflow的一些问题和答案,意识到在C#中使用+=添加事件处理程序(或者我猜,其他.net语言)会导致常见的内存泄漏。 过去我多次使用过这样的事件处理程序,从来没有意识到它们可能导致或已经导致了我的应用程序中的内存泄漏。 这是如何工作的(意思是,为什么这会导致内存泄漏)? 我该如何解决这个问题? 正在使用-=相同的事件处理程序吗? 有处理这种情况的常见devise模式或最佳实践吗? 示例:我该如何处理具有多个不同线程的应用程序,使用许多不同的事件处理程序在UI上引发多个事件? 有没有什么好的和简单的方法在已经build成的大型应用程序中有效地进行监控?
在PHP中使用singleton代替全局数据库连接有什么好处? 我觉得使用单例而不是全局使代码不必要的复杂。 代码与全球 $conn = new PDO(…); function getSomething() { global $conn; . . . } 与单身人士代码 class DB_Instance { private static $db; public static function getDBO() { if (!self::$db) self::$db = new PDO(…); return self::$db; } } function getSomething() { $conn = DB_Instance::getDBO(); . . . } 如果有更好的初始化数据库连接而不是全局或单例的方法,请提及它并描述它对全局或单例的优点。
有什么方法可以消除代码中的开关的使用?
C ++中有这样一件事情,使我长时间感到不舒服,因为我真的不知道该怎么做,尽pipe听起来很简单: 如何在C ++中正确实现工厂方法? 目标:使客户可以使用工厂方法而不是对象的构造函数实例化一些对象,而不会造成不可接受的后果和性能问题。 “工厂方法模式”是指对象内部的静态工厂方法或其他类中定义的方法或全局函数。 一般来说,“把X类实例化的正常方式redirect到构造函数以外的任何地方”的概念。 让我浏览一下我想到的一些可能的答案。 0)不要制造工厂,build造者。 这听起来不错(通常是最好的解决scheme),但不是一般的补救措施。 首先,有些情况下,对象build设是一个任务复杂到足以certificate其提取到另一个类。 但是即使把这个事实放在一边,即使对于使用构造函数的简单对象也是不行的。 我所知道的最简单的例子是一个2Dvector类。 这么简单,但棘手。 我希望能够从笛卡儿坐标和极坐标两方面构造它。 显然,我不能这样做: struct Vec2 { Vec2(float x, float y); Vec2(float angle, float magnitude); // not a valid overload! // … }; 那么我自然的思考方式是: struct Vec2 { static Vec2 fromLinear(float x, float y); static Vec2 fromPolar(float angle, float magnitude); // … }; 其中,而不是构造函数,导致我使用静态工厂方法…这基本上意味着我正在实施工厂模式,以某种方式(“class级成为自己的工厂”)。 […]
什么是分离关注? 什么是关心? 如何将应用程序分成这些“不同的问题”?
前/后递增/递减运算符( ++和– )是非常标准的编程语言语法(至less对于过程和面向对象的语言)。 为什么Ruby不支持他们? 我知道你可以用+=和-=来完成同样的事情,但是排除类似的东西似乎是非常随意的,特别是因为它非常简洁和传统。 例: i = 0 #=> 0 i += 1 #=> 1 i #=> 1 i++ #=> expect 2, but as far as I can tell, #=> irb ignores the second + and waits for a second number to add to i 我知道Fixnum是不可变的,但是如果+=可以实例化一个新的Fixnum并设置它,为什么不对++做同样的操作呢? 包含=字符的赋值的一致性是唯一的原因,还是我错过了什么?
我的应用程序中将包含以下组件 数据访问 DataAccess.Test 商业 Business.Test 应用 我希望使用温莎城堡作为IoC粘合层,但我有点不确定的胶合devise。 我的问题是谁应该负责注册的对象进入温莎? 我有几个想法; 每一层都可以注册自己的对象。 为了testingBL,testing台可以为DAL注册模拟类。 每层可以注册其依赖关系的对象,例如,业务层注册数据访问层的组件。 为了testingBL,testing台将不得不卸载“真实”的DAL对象并注册模拟对象。 应用程序(或testing应用程序)注册依赖关系的所有对象。 有人能帮助我一些想法和优点/缺点与不同的path? 以这种方式使用温莎城堡的示例项目的链接将是非常有帮助的。
使用新线程和使用线程池中的线程有什么区别? 有什么性能优势,为什么我应该考虑使用池中的线程,而不是我明确创build的线程? 我在这里专门讨论.NET,但一般的例子都很好。