所以我们有这个课程class Identity
和class CanineCommunication
然后我们要定义一个类
class Dog {
public Dog() {
Identity id;
CanineCommunication cc;
}
id.getParticulars(); //we can call all the public Identity methods
cc.getMoves(); //and also the public CanineCommunication methods
}
但假设CanineCommunication类中的方法需要使用Identity方法 - 一种显而易见的方法是:
class CanineCommunication {
getNoises(Identity id) {
id.getParticulars();
//~~if small be squeaky &c~~
}
另一种方式是:
class CanineCommunication {
Identity id;
public canineCommunication (Identity id) {
this.id=id;
}
getNoises() {
id.getParticulars();
//~~if small be squeaky &c~~
}
这些方法如何比较?还有其他(更好/更差)的方法来实现这个目标吗?
答案 0 :(得分:1)
这取决于您的设计: 在您将Identity对象传递给构造函数的情况下,您正在处理Identity的单个实例,您可能需要处理任何静态变量或threas不安全变量
如果你传递同一个对象但是你每次都可以灵活地传递新对象,那么每次你在类似的情况下都会传递Identity对象
或多或少取决于您的要求
答案 1 :(得分:0)
如果您的CanineCommunication
实例仅适用于一个Identity
,那么第二种方法会更好。因此,每个CanineCommunication
都有自己的Identity
,并且只使用此Identity
。
如果您的CanineCommunication#getNoises
方法应该使用不同的身份,那么第一种方法会更好。
答案 2 :(得分:0)
问题是关系问题:noise
属于哪里? bark
的属性是Dog
还是Dog
使用来自SoundSystem的doBark
?
“正确”的实现总是取决于您的实际代码。例如,最好有一个SoundSystem实现,以确保实际的wave文件不会在内存中重复,并限制对声道的访问。因为在这种情况下,“声音”是(作为内存中的资源)与资源管理器相关的。
但是如果你有一些轻量级的沟通方式而且“声音”只不过是一个字符串,那么像myDog.bark()
这样的东西可能会更容易。
答案 3 :(得分:0)
嗯,我会使用枚举来模拟caninccommunication。然后狗会有一个CanineCommunication类型列表。
一只小狗将成为一个扩展你的阶级狗的班级,并在他的名单中自动进行一次狡猾的犬交流。
然后你可以做这样的事情:for(Dog myDog : myDogs)
{
if(myDog.getCanineCommunications().contains(CanineCommunication.SQUEKY))
{
myDog.doSomething();
}
}