我有两个类Foo
和Bar
,以及一个使用这两个类的Algorithm
类。
class Foo {
void method(Bar bar) {
bar.otherMethod();
...
}
}
class Bar {
void method() {
...
}
void otherMethod() {
...
}
}
class Algorithm {
void run(Foo foo, Bar bar) {
foo.method(bar);
bar.method();
...
}
}
算法部分(run
方法)是通用的,我希望能够在其他项目中重用它,包括类似于Foo
和Bar
的其他类对,我知道每个人都有名为method
的方法。但是,我不想将Bar.otherMethod
置于接口级别(因为它不是其他IFoo
和IBar
对所需的通用功能。)
出于这个原因,我定义了两个接口:
interface IFoo {
void method(IBar bar);
}
和
interface IBar {
void method();
}
并更改了Algorithm.run()
的签名以便将这些接口用于
void run(IFoo foo, IBar bar).
问题在于,现在,在Foo
类中,我必须进行强制转换才能使用其关联的Bar
类中的特定方面。当我使用另一对类时,可能必须进行类似的演员(例如,我可能有Foo2
和Bar2
,其中Foo2.method
我需要演员{{1}参数IBar
,以便能够使用特定功能。)
Bar2
一般情况下,此演员表是糟糕设计的指标。确实存在问题吗?对于我打算使用通用class Foo implements IFoo {
void method(IBar bar) {
(Bar)bar.otherMethod();
...
}
}
方法,有什么更好的方法?
编辑:
一个相关方面是实践中的Algorithm.run()
和Foo
实现实际上将成对出现。在某些时候,我可能会有其他类Bar
和Foo2
,其中Bar2
不需要调用Foo2.method
。在这种情况下,初始Bar2.otherMethod
将与Foo
不兼容,但我对此类用例不感兴趣 - 是否可以通过不同的设计进行标记?
Edit2:更改了标题和文字,以便更好地表达我有兴趣一次使用一对Bar2
和Foo
课程。
答案 0 :(得分:1)
.submit();
和Foo
需要不同的类型吗?听起来每个Bar
和Foo
都是紧密耦合的。也许他们应该合并。
答案 1 :(得分:1)
您可能希望利用泛型。也许你有:
interface Bar {
void frob();
}
interface Foo<T extends Bar> {
void frood(T bar);
}
然后当你写:
Foo<SomeBar> foo = // ...
SomeBar bar = // ...
foo.frood(bar);
Foo
实现知道它有,而不仅仅是Bar
,但具体是SomeBar
。
答案 2 :(得分:0)
是的,将IBar
转换为Bar
是矛盾的:您使用接口但希望依赖于所有IBar
实现将属于Bar
类型或其子类型的事实,你无法保证。
在你的场景中,在otherMethod
界面中声明IBar
是一个较小的邪恶。
答案 3 :(得分:-1)
一般情况下,此演员表是糟糕设计的指标......
不是真的,接口是一个非常好的方法来分割一个类做什么以及类如何做更多
阅读this了解更多详情,或者查看此帖https://stackoverflow.com/a/384067/982161