Tag: 抽象

为什么接口首选抽象类?

我最近参加了一个采访,他们问我“为什么接口比抽象类更受欢迎? 我试着给出几个答案,如: 我们只能得到一个Extendsfunction 他们是100%摘要 实现不是硬编码的 他们问我使用任何你使用的JDBC API。 “他们为什么是接口?” 我能得到更好的答案吗?

C#,像方法一样实现“静态抽象”

我最近碰到一个问题,似乎我需要一个“静态抽象”的方法。 我知道为什么这是不可能的,但我怎样才能解决这个限制? 例如,我有一个抽象类,它有一个描述string。 由于这个string对于所有实例都是通用的,所以它被标记为静态的,但是我想要求从这个类派生的所有类都提供它们自己的Description属性,所以我把它标记为抽象的: abstract class AbstractBase { … public static abstract string Description{get;} … } 当然不会编译。 我想使用接口,但接口可能不包含静态方法签名。 我是否应该简单地使它成为非静态的,并且总是得到一个实例来获得这个类的具体信息? 有任何想法吗?

Ruby中的抽象方法

我如何强制一个子类在Ruby中实现一个方法。 Ruby中似乎没有抽象关键字,这是我在Java中采用的方法。 还有另外一种类似Ruby的方法来强制抽象吗?

Java中的抽象variables?

我来自C#这很容易,可能的。 我有这个代码: public abstract class clsAbstractTable { public abstract String TAG; public abstract void init(); } 但Eclipse告诉我我使用非法修饰符。 我有这个class级: public class clsContactGroups extends clsAbstractTable { } 我想以这种方式定义variables和方法,即Eclipse来提示我 ,我没有实现抽象variables和方法。 我如何定义我的抽象类,以便提示实现摘要? 编辑1 我将为不同的数据库表创build不同的类。 每个类应该有它自己的TABLENAMEvariables,没有例外。 当我创build一个扩展抽象类的新类时,我必须确保这个variables是静态的。 然后在抽象类中,我将有一个方法,例如:init(); 如果在这个init()方法中我调用TABLENAME,它应该从子类中取值。 像这样的事情也应该解决 String tablename=(clsAbstract)objItem.TABLENAME; // where objItem can be any class that extended clsAbstract; 编辑2 我想在每个类中定义一个常量(静态),它的名称在抽象中定义。 我在抽象中定义variablesTABLENAME,但没有给出值。 我创build了一个clsContactGroups,我应该提示实现TABLENAME,这是获取一些数据的地方。 例如:TABLENAME =“contactgroups”; 我创build了第二个类clsContacts,我应该提示实现TABLENAME,这是获取一些数据的地方。 例如:TABLENAME […]

理解封装和抽象的简单方法

学习面向对象的概念特别有兴趣深入理解抽象和封装。 已经检查了下面 抽象VS信息隐藏VS封装 抽象和封装之间的区别? 我发现很难用真正简单的示例类/代码段来理解这些概念。 我的一位同事说,抽象只不过是创build抽象类和保护其成员variables的普通类,其范围称为封装(Encapsulation)。 有一个简单的方法,我可以理解,并帮助他人了解到底是什么,而不是重复下面? 抽象和封装是相辅相成的概念:抽象的重点在于一个对象的可观察的行为…封装着重于引起这种行为的实现…封装通常是通过信息隐藏实现的,这是隐藏所有对其本质特征没有贡献的对象的秘密。

在C#中使用“抽象覆盖”是什么?

出于好奇,我试图覆盖基类中的抽象方法,并且实现抽象方法。 如下: public abstract class FirstAbstract { public abstract void SomeMethod(); } public abstract class SecondAbstract : FirstAbstract { public abstract override void SomeMethod(); //?? what sense does this make? no implementaion would anyway force the derived classes to implement abstract method? } 很想知道为什么C#编译器允许编写“抽象覆盖”。 这不是多余的吗? 应该是编译时错误做这样的事情。 它是否适用于某些用例? 感谢您的关注。

抽象和封装如何不同?

我正在准备采访,并决定刷新我的面向对象的概念。 有数百篇文章,但似乎每个人都有不同的描述。 有人说 抽象是“识别具有系统变化的常见模式的过程;抽象代表了常见模式,并提供了指定使用哪种变化的手段”(Richard Gabriel)。 并通过抽象类来实现。 其他人说 抽象意味着只向对象的客户显示必要的细节 和 假设您的Employee类中有一个“CalculateSalary”方法,它将EmployeeId作为参数,并将当前月份的员工工资作为整数值返回。 现在,如果有人想要使用这种方法。 他不需要关心Employee对象如何计算工资? 他唯一需要关注的是方法的名称,input参数和结果成员的格式, 我一遍又一遍地search,结果似乎没有给我一个正确的答案。 现在,封装在哪里都适合? 我search,发现一个堆栈溢出的问题 。 即使这个问题的答案是混淆在这里 ,它说 封装是一种用作抽象的一部分的策略。 封装是指对象的状态 – 对象封装它们的状态并将其隐藏起来; 类的外部用户通过它的方法与它交互,但不能直接访问类的状态。 所以这个类抽象出与其状态相关的实现细节。 另外一位知名的成员说, 他们是不同的概念。 抽象是细化一个对象的所有不必要/不重要的属性,只保留最适合你的领域的特征的过程。 现在我搞砸了整个概念。 我知道抽象类,inheritance,访问说明符和所有。 我只想知道在面试中被问及抽象和/或封装的时候应该如何回答。 请不要将其标记为重复 。 我知道有几个类似的问题。 但是我想避免相互矛盾的解释之间的混淆。 任何人都可以build议一个可信的链接? 链接到stackoverflow问题也是受欢迎的,除非它再次造成混乱。 🙂 编辑:我需要答案,有点面向c#

为什么Haskell错过了“显而易见的”types

考虑面向对象的语言: 大多数来自面向对象编程背景的人都熟悉各种语言中常见的直观界面,这些界面捕捉了Java Collection & List界面的精髓。 Collection是指不一定具有自然顺序/索引的对象的集合。 List是一个具有自然顺序/索引的集合。 这些接口抽象了Java中的许多库数据结构,就像他们在其他语言中的等价接口一样,并且需要对这些接口有一个深入的了解才能与大多数库数据结构有效地协作。 过渡到Haskell: Haskell有一个types类系统,类似于对象上的接口types。 Haskell似乎有一个关于Functors,Applicative,Monads等devise良好的types层次结构 。 他们显然需要正确和抽象的types 。 然而,当你看到许多Haskell的容器( List , Map , Sequence , Set , Vector )时,它们几乎都具有非常相似的(或相同的)function,但不是通过types类来抽象的。 一些例子: null用于testing“ null ” 元素数量的length / size elem / member列入集合 empty 和/或 singleton默认构造 union联盟 (\\) / diff设置差异 (!) / (!!)进行不安全的索引(部分function) (!?) / lookup安全索引(总function) 如果我想使用上面的任何函数,但是我导入了两个或多个容器,我必须从导入的模块中隐藏函数,或者只从模块导入必要的函数,或者限定导入的模块。 但是因为所有的function都提供了相同的逻辑function,所以看起来就像一个麻烦。 如果函数是从types类定义的,而不是在每个模块中单独定义的,那么编译器的types推断机制就可以解决这个问题。 只要他们共享types类(例如:让我们只使用Sequence而不是List来获得更好的随机访问效率),它也会使底层容器的切换变得简单。 为什么Haskell没有一个Collection和/或Indexabletypes的类来统一和概括这些函数呢?

漏抽象的意义?

“抽象抽象”是什么意思? (请用实例来解释,我经常很难理解一个理论。)

为什么我应该使用人类可读的文件格式?

为什么我应该使用人类可读的文件格式而不是二进制文件? 当情况不是这样的时候,有没有这种情况? 编辑:最初发布这个问题时,我确实有这个解释,但是现在并不那么重要: 当回答这个问题时,我想引用提问者一个标准的答案,为什么使用人类可读的文件格式是一个好主意。 然后我search了一个,找不到一个。 所以这是个问题