可能重复:
何时使用接口而不是抽象类,反之亦然?
嗨,我正在向非程序员教授OOP概念.我想知道如何解释接口和抽象类之间的区别.
我实际上正在寻找的,是一个真实世界的例子,可以帮助突出两者之间的差异.
我正试图在Ruby on Rails中设计一个成就系统,并且遇到了我的设计/代码.
试图使用多态关联:
class Achievement < ActiveRecord::Base
belongs_to :achievable, :polymorphic => true
end
class WeightAchievement < ActiveRecord::Base
has_one :achievement, :as => :achievable
end
Run Code Online (Sandbox Code Playgroud)
迁移:
class CreateAchievements < ActiveRecord::Migration
... #code
create_table :achievements do |t|
t.string :name
t.text :description
t.references :achievable, :polymorphic => true
t.timestamps
end
create_table :weight_achievements do |t|
t.integer :weight_required
t.references :exercises, :null => false
t.timestamps
end
... #code
end
Run Code Online (Sandbox Code Playgroud)
然后,当我尝试下面的抛弃单元测试时,它会失败,因为它表示该成就为空.
test "parent achievement exists" do
weightAchievement = WeightAchievement.find(1)
achievement = weightAchievement.achievement
assert_not_nil achievement
assert_equal 500, weightAchievement.weight_required
assert_equal …Run Code Online (Sandbox Code Playgroud) 显然,应用这两种方法对团队,客户,投资回报率等的影响差异很大,并且是许多书籍和无休止的讨论和会议的主题.
但是,当我更多地考虑它时,我很难找到两者之间的任何差异,这些差异最终不会映射到单个根差异,即释放的频率.
瀑布花费时间在设计上,然后编写代码,然后测试并最终发布.但是敏捷完成了同样的一系列步骤 - 只是每个步骤都更小.
敏捷方法的一个关键部分是从每个版本中学习并使用它来让更大的设计出现,而不是在开始时尝试预测它.
但瀑布也是这样做的.只是不是每隔3或4周学习一次,瀑布团队每6或9个月只能学习一次.但瀑布设计仍然出现.也就是说,瀑布版本2将反映在版本1中学到的内容.因此,该过程并没有不同,只是它以不同的速度执行.
敏捷专注于密切的客户协作.但瀑布也是这样做的.它只是因为瀑布具有更长的迭代时间,所以需要以合同形式列出的需求列表,以使所有人在很长一段时间内保持在同一页面上.但同样,这只是一个频率的工件.交货频率越高,合同需求越低.
我还缺少其他原始差异 - 或者它只是频率?
我需要使用以下正则表达式来验证一些亚洲字符
$regexp = "/^[\-'\u2e80-\u9fff\sa-zA-Z.]+$/"; // with warning
$regexp = "/^[\-'\sa-zA-Z.]+$/"; // without warning
Run Code Online (Sandbox Code Playgroud)
preg_match()[function.preg-match]:编译失败:PCRE不支持\ L,\ l,\ N,\ P,\ p,\ U,\ u或\ X.
你知道如何更改正则表达式模式,以便我可以验证亚洲字符 \u2e80-\u9fff
我正在使用最新的XAMPP
Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在学习LINQ,我不知道如何写一个查询来返回一个布尔值,指示是否在数组中找到了一个项目.我有一个非常简单的清单:
var targetProperties = new string[] { "SelectedDate", "SelectedMonth" };
Run Code Online (Sandbox Code Playgroud)
我需要编写一个LINQ查询,如果传入的项目在数组中,则返回true,如果不是,则返回false.那个查询会是什么样的?谢谢你的帮助.
我正在尝试基于XML文档中的字符串在LINQ-to-XML查询中动态创建某种类型的对象.我习惯于能够在PHP和JavaScript中动态创建任何类型的对象,只需编写类似下面的内容:
$obj = new $typeName();
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望能够做到这样的事情:
List<someObj> = (from someObjs in XMLfile
select new someObj()
{
Name = (string)someObjs.Element("name"),
NestedObj = new someObjs.Element("nestedObj").Element("type")()
{
NestedName = (string)someObjs.Element("nestedObj").Element("name")
}
}).ToList();
Run Code Online (Sandbox Code Playgroud)
如果不抓住当前正在执行的程序集,我就无法弄清楚如何做到这一点.
我在点击时尝试为div页面添加新内容NEW DIV?
我怎么能这样做?有人能指出我正确的方向吗?
在C中,当我们访问a[i][j]使用指针,为什么我们还需要第二次*的*(*(a + i) + j)?使用printf()我看到a + i并*(a + i)打印相同的值.
我想翻译10000000.0成PREFIX10,000,000.00
我可以知道我应该将哪种模式传递给DecimalFormat?
NumberFormat numberFormat = new DecimalFormat(...);
numberFormat.format(10000000.0);
Run Code Online (Sandbox Code Playgroud) 我有一组书籍和作者的数据集,具有多对多的关系.
大约有10 ^ 6本书和10 ^ 5位作者,每本书平均有10位作者.
我需要对数据集执行一系列操作,例如计算每个作者的书籍数量,或者从集合中删除某个作者的所有书籍.
什么是一个允许快速处理的良好数据结构?
我希望有一些现成的模块可以提供以下方法:
obj.books.add(book1)
# linking
obj.books[n].author = author1
obj.authors[m].author = book1
# deleting
obj.remove(author1) # should automatically remove all links to the books by author1, but not the linked books
Run Code Online (Sandbox Code Playgroud)
我应该澄清一点,我不想为此使用数据库,而是在内存中完成所有操作.
谢谢