为什么C#这样devise? 据我所知,一个接口只描述行为,并描述一个实现特定行为的接口类的契约义务。 如果class级希望以共享的方式实施这种行为,他们为什么不呢? 以下是我想到的一个例子: // These items will be displayed in a list on the screen. public interface IListItem { string ScreenName(); … } public class Animal: IListItem { // All animals will be called "Animal". public static string ScreenName() { return "Animal"; } …. } public class Person: IListItem { private string name; // […]
面试官问 – 我们可以实例化一个抽象类吗? 我说,不,他告诉我 – 错了,我们可以。 我在这方面辩论了一下。 然后他让我在你家里试试这个。 abstract class my { public void mymethod() { System.out.print("Abstract"); } } class poly { public static void main(String a[]) { my m = new my() {}; m.mymethod(); } } 在这里,我正在创build我的类的实例并调用抽象类的方法。 任何人都可以向我解释这个吗? 在面试中我真的错了吗?
自从去年开始学习F#和OCaml以来,我已经阅读了大量的文章,坚持认为devise模式(尤其是Java)是命令式语言中缺less特性的解决方法。 我发现的一篇文章提出了相当强烈的说法 : 我遇到的大多数人都阅读了“四人帮”的devise模式书。 任何自我尊重的程序员都会告诉你,这本书是语言不可知的,这些模式一般适用于软件工程,不pipe你使用哪种语言。 这是一个崇高的主张。 不幸的是,事实远非如此。 function语言是非常有performance力的。 在一种function语言中,由于语言可能如此之高,所以不需要devise模式,最终可以将概念中的devise模式排除在外。 函数式编程的主要function包括函数作为第一类值,柯里化,不可变的值等。对我来说,OOdevise模式近似于任何这些特性似乎并不明显。 此外,在支持OOP的函数式语言(如F#和OCaml)中,使用这些语言的程序员使用与其他所有OOP语言相同的devise模式似乎是显而易见的。 实际上,现在我每天都在使用F#和OCaml,而且我在这些语言中使用的模式与我在使用Java编写时使用的模式之间没有明显的区别。 function性编程是否消除了对OOPdevise模式的需求,是否有任何事实? 如果是这样,你可以发布或链接到一个典型的OOPdevise模式的例子和它的function等效?
我想在PHP中创build一个基于由MySQL数据库中的string定义的types的对象。 数据库表具有以下列和样本数据: id | type | propertyVal —-+——+————- 1 | foo | lorum 2 | bar | ipsum …与PHP数据types class ParentClass {…} class Foo extends ParentClass {private $id, $propertyVal; …} class Bar extends ParentClass {private $id, $propertyVal; …} //…(more classes)… 只使用一个查询,我想通过idselect一个行,并创build一个types的对象定义表的types列与SELECTed行中的其他列被分配到新创build的对象。 我在想,使用: mysql_fetch_object() 读取types属性 创build一个types由type属性定义的对象 但是知道没有办法根据stringdynamic创build一个types。 如何做到这一点?
在PHP中,(不像我原先想的那样)有调用静态方法和简单函数的开销。 在一个非常简单的工作台上,这个开销超过了调用时间的30%(方法刚刚返回参数): // bench static method $starttime = microtime(true); for ($i = 0; $i< 10*1000*1000; $i++) SomeClass::doTest($i); echo "Static Time: " , (microtime(true)-$starttime) , " ms\n"; // bench object method $starttime = microtime(true); for ($i = 0; $i< 10*1000*1000; $i++) $someObj->doTest($i); echo "Object Time: " , (microtime(true)-$starttime) , " ms\n"; // bench function $starttime = […]
两个关键字Shadows和Overrides的意义是什么? 他们做了什么,为什么上下文是一个或另一个更好?
虽然某些指导方针声明,当您想要为inheritance不清楚的类定义合同( IDomesticated ),并且在类是另一个类的扩展时( Cat : Mammal , Snake : Reptile )的inheritance,您应该使用接口。 (在我看来)这些指导方针进入灰色地带的情况。 例如,说我的实施是Cat : Pet 。 Pet是一个抽象的类。 是否应该扩展到Cat : Mammal, IDomesticated Mammal是抽象类和IDomesticated是一个接口? 还是我和KISS / YAGNI的原则相冲突(即使我不确定将来会不会有一个Wolf阶级,而这个阶级是不能从Petinheritance的)? 摆脱隐喻的Cat和Pet ,让我们说我有一些代表传入数据来源的类。 他们都需要以某种方式实施相同的基地。 我可以在一个抽象的Source类中实现一些通用的代码,并inheritance它。 我也可以创build一个ISource接口(对我来说感觉更“正确”),并在每个类中重新实现generics代码(这不太直观)。 最后,我可以通过制作抽象类和接口来“吃蛋糕”。 什么是最好的? 这两种情况提出只使用抽象类,只使用一个接口,同时使用抽象类和接口。 这些都是有效的select,还是有什么“规则”,什么时候应该用于另一个? 我想澄清的是,通过“同时使用抽象类和接口”来包含它们本质上代表相同事物( Source和ISource都具有相同成员)的情况,但是该类在接口指定时添加了一般function合同。 另外值得注意的是,这个问题主要针对不支持多inheritance的语言(如.NET和Java)。
我正在学习C ++,但是我对抽象类和具体类感到困惑。 一些真实世界的例子将不胜感激。
我知道这个问题以前已经讨论过了 ,但是总是认为inheritance至less有时比组合更好。 我想挑战这个假设,希望得到一些理解。 我的问题是这样的: 因为你可以完成任何东西与对象组成,你可以用古典inheritance,因为古典inheritance经常被滥用[1] ,因为对象组成给你灵活地改变委托对象的运行时, 为什么你会用古典inheritance? 我可以理解为什么你会推荐一些像Java和C ++这样的语言来inheritance,这些语言没有提供方便的委托语法。 在这些语言中,只要不明显不正确,就可以使用inheritance来节省大量的input。 但是像Objective C和Ruby这样的其他语言既可以提供经典的inheritance,也可以为委派提供非常方便的语法。 Go编程语言是我所知的唯一的语言决定古典inheritance是比它的价值更麻烦,并且只支持委托代码重用。 另一种表述我的问题的方法是:即使你知道古典inheritance不是不正确的实现一个特定的模型,是否有足够的理由来使用它,而不是组成? [1]许多人使用经典的inheritance来实现多态,而不是让他们的类实现一个接口。 inheritance的目的是代码重用,而不是多态。 此外,有些人使用inheritance来模拟他们对“一个”的关系的直观理解,这个关系往往是有问题的 。 更新 我只是想澄清我的意思,当我谈论inheritance: 我正在谈论一种类inheritance,从一个部分或完全实现的基类inheritance 。 我并不是在谈论从一个纯粹的抽象基类inheritance,这个基类和实现一个接口是一样的,而我所logging的这个接口并不是反对的。 更新2 我知道inheritance是实现C ++多态性的唯一方法。 在这种情况下,很显然你必须使用它。 所以我的问题仅限于诸如Java或Ruby之类的语言,它们提供了实现多态的独特方法(分别为接口和鸭子打字)。
看起来好像我错过了这个观点,或者误解了Ruby中单例类的重要性。 我从很多方面听过和读过这些东西 – 比其他东西更复杂一些 – 但我对它是什么感到困惑。 它本身是一个阶级吗? 这是所有物体属于“阶级”的原因吗? 这个概念是模糊的 ,但是我相信它跟我为什么可以定义一个类方法(class foo; def foo.bar …)有关系。 那么:Ruby中的单例类是什么?