是否有特定的设计模式描述了提供非抽象默认实现的场景,该实现使用空的NO-OP实现实现接口上的所有或部分方法.这样做的目的是减轻子类的负担,实现他们自己可能不需要/使用的方法:
public interface MyInterface {
public void doThis();
public void doThat();
public void done();
}
public class MyClass implements MyInterface {
public void doThis() {
// NO-OP
}
public void doThat() {
// NO-OP
}
public void done() {
// Some standard implementation
}
}
public class MuSubClass extends MyClass {
public void doThat() {
// Subclass only cares about doThat()
}
}
Run Code Online (Sandbox Code Playgroud)
我已经看到过这种模式多次使用,包括SAX框架中的Java的DefaultHandler和MouseAdapter.在某些情况下,这些类被命名为Adapters,但我的印象是适配器模式在两个不同的接口之间进行转换.
鉴于在这些实例中只有一个声明的接口被转换为该接口的未定义子集 - 我不清楚这是如何在适配器模式的精神.
此外,我不太明白这是如何遵循NullObject模式的,因为某些方法可能有一个实现,而NullObject传统上是一个单例.
design-patterns adapter null-object-pattern solid-principles interface-segregation-principle
我目前正在处理的应用程序大量使用NHibernate的存储库模式.我们有一个通用的基础存储库类,它实现了标准的获取和保存.然后,此类由每种类型的存储库继承.然后,这些存储库可以添加自己的类型特定方法(并覆盖保存并在必要时获取).
这很有效,从关注点的角度来看,这意味着我们的业务对象是POCO,我们的存储库类处理保存的细节.实际上,当我们有一个类型能够说"让我获得可以保存此类型的存储库"时,它将非常有用.有什么模式可以用来做到这一点?我需要维护自己的查找表吗?可以以某种方式自动维护查找表吗?
目前我对前向声明和模板功能有一个令人沮丧的问题.我一直在尝试谷歌搜索并做一些修改但到目前为止没有任何工作.以下是代码的片段:
class TaskScheduler; --> //forward declaration of ‘struct TaskScheduler’
//
//
class TaskEvent {
//
//
};
class HostTask {
//
//
};
template<class T> inline HostTask*
findT(TaskScheduler* tss, T* e)
{
map<int, HostTask*>::iterator it;
bool bEq = false;
for(it = tss->tasks_.begin(); it != tss->tasks_.end(); it++) { --> //error: invalid use of incomplete type ‘struct TaskScheduler’
if(dynamic_cast<TaskEvent*>(e))
bEq = dynamic_cast<TaskEvent*>(e)->equal(it->second->ev_);
else if(dynamic_cast<HostTask*>(e))
bEq = dynamic_cast<HostTask*>(e)->equal(it->second);
if(bEq) {
return it->second;
}
}
return NULL;
}
//
//class TaskScheduler definition
class TaskScheduler …Run Code Online (Sandbox Code Playgroud) 我试图在MySQL中将字符串哈希到64位值(bigint).我知道MD5()函数,它返回一个128位散列作为二进制字符串.我很乐意把这个结果的底部或前64位.但是,我无法弄清楚如何从二进制字符串类型到任何类型的数字类型.有什么指针吗?
或者我应该只显式引用我想调用其方法的超类?
在引用它们的构造函数时重复超类的名称似乎很脆弱,但是这个页面http://fuhm.net/super-harmful/对使用super()做了一些很好的论据.
在.Net/C#中加密SQLite数据库文件的最佳方法是什么?我正在使用sqlite-dotnet2包装器.
有像SQLite加密扩展和SQLite Crypt这样的工具,但两者都是非自由的,而我的项目是在GPL下.
我想要使用的天真方法是让SQLite处理一个临时文件,然后在程序退出时对其进行加密,并覆盖(清零)原始文件.显而易见的缺点是,如果程序崩溃(并且在运行时),则可以访问纯文本DB.
有没有更好的方法来解决这个问题?我可以将加密流传递给包装器(而不是使用SQLiteConnection.CreateFile)吗?
[编辑]也许我在思考这个问题.是否足以在连接字符串中使用密码选项?在这种情况下文件是否会被正确加密(或者它是一些较弱的保护)?
我在一个页面上有两个相同的collection_selects(一个消息属于2组)
<%=
collection_select(:message,:group_ids, Group.find(:all),:id, :title, {}, {:name=>'message[group_ids][]'} )
%>
<%=
collection_select(:message,:group_ids, Group.find(:all),:id, :title, {}, {:name=>'message[group_ids][]'} )
%>
Run Code Online (Sandbox Code Playgroud)
是否可以使用collection_select为它们设置两个不同的选定值?
编辑:
我想我必须做点什么
<%
@message.group_id=5
%>
<%=
collection_select(:message,:group_id, Group.find(:all),:id, :title, {}, {:name=>'message[group_ids][]'} )
%>
<%
@message.group_id=6
%>
<%=
collection_select(:message,:group_id, Group.find(:all),:id, :title, {}, {:name=>'message[group_ids][]'} )
%>
Run Code Online (Sandbox Code Playgroud)
但当然它不起作用,并给出方法遗漏错误
编辑2:
猜猜没有办法用collection_select来做.除非group有方法,每次返回单个group_id.
我最终得到的是
select_tag 'message[group_ids][]', "<option></option>"+options_from_collection_for_select(Group.find(:all), 'id', 'title',group1.id)
select_tag 'message[group_ids][]', "<option></option>"+options_from_collection_for_select(Group.find(:all), 'id', 'title',group2.id)
Run Code Online (Sandbox Code Playgroud) 我有一个关于Django的设计问题。我不太确定如何将应用程序松散耦合的原理应用于此特定问题:
我有一个订单应用程序(在线商店中)管理订单。在此订单应用程序中,我有两个类:
class Order(models.Model):
# some fields
def order_payment_complete(self):
# do something when payment complete, ie. ship products
pass
class Payment(models.Model):
order = models.ForeignKey(Order)
# some more fields
def save(self):
# determine if payment has been updated to status 'PAID'
if is_paid:
self.order.order_payment_complete()
super(Payment, self).save()
Run Code Online (Sandbox Code Playgroud)
现在的实际问题是:我有一个更专业的应用程序,可以扩展此顺序。因此,它向其中添加了更多字段,等等。例如:
class SpecializedOrder(Order):
# some more fields
def order_payment_complete(self):
# here we do some specific stuff
pass
Run Code Online (Sandbox Code Playgroud)
现在,当然,预期的行为如下:我创建一个SpecializedOrder,放置此订单的付款,并order_payment_complete()调用SpecializedOrder 的方法。但是,由于“付款”链接到“订单”而不是“ SpecializedOrder”,因此order_payment_complete()将调用基本“订单” 的方法。
我真的不知道实现这种设计的最佳方法。也许我已经完全不了解了-但是我想构建此订单应用程序,以便可以将其用于多种用途,并希望使其尽可能通用。
如果有人可以在这里帮助我,那就太好了!谢谢,尼诺
使用Javascript如何识别给定位置的元素?基本上我正在寻找一个带有两个输入参数(x和y坐标)的函数,并返回由参数表示的屏幕位置的html元素.
在我看来,业务对象的ID字段应该是只读的(公共get和私有集),因为根据定义,ID永远不会改变(因为它唯一地标识数据库中的记录).
这会在您创建新对象(尚未设置ID)时产生问题,通过存储过程将其保存在数据库中,例如返回新创建的ID,如果读取ID属性,如何将其存储回对象-只要?
例:
Employee employee = new Employee();
employee.FirstName="John";
employee.LastName="Smith";
EmployeeDAL.Save(employee);
Run Code Online (Sandbox Code Playgroud)
如果此属性是只读的,那么Save方法(实际连接到数据库以保存新员工)如何更新Employee对象中的EmployeeId属性(应该是EmployeeId在创建后永远不会更改).
看起来Id应该可以由DAL写入,并且只读给世界其他地方.如果DAL类和Business对象在不同的程序集中,您如何实现这一点?
我不想在Employee类中创建一个Save方法,因为这个类应该与数据库无关.
c# ×3
.net ×1
adapter ×1
bigint ×1
binary ×1
c++ ×1
django ×1
dom ×1
encryption ×1
file ×1
hash ×1
html ×1
interface-segregation-principle ×1
javascript ×1
md5 ×1
mysql ×1
nhibernate ×1
oop ×1
python ×1
repository ×1
sqlite ×1
super ×1