我正在尝试实现一个重载的接口方法。我知道这在Java中不起作用,但我怎样才能重写以下内容以在action()
方法中使用实现类型,而不是Base
类型?
class Base;
class Foo extends Base;
class Bar extends Base;
interface IService {
void action(Base base);
}
class FooService implements IService {
void action(Foo foo) {
//executes specific foo action
}
}
class BarService implements IService {
void action(Bar bar) {
//executes specific Bar action
}
}
用法:
Base base; //may be foo or bar
anyService.action(bar);
你明白了。我怎么能这样做?
答案 0 :(得分:1)
Java不支持此操作,并且您违反了OOP规则。
答案 1 :(得分:1)
根据您的预期用途,有很多事情要尝试。
如果您打电话给IService知道他们可以采取哪种对象,您可以尝试使用泛型。
interface IService<T extends Base> {
void action(T foo)
}
和用法:
IService<Foo> fooService = ...
fooService.action(fooObject);
如果情况并非如此,您可以在“基础”类中进行一些检查,以便区分您的IService界面。
class Base {
boolean acceptsFoo();
boolean acceptsBar();
}
你可以像以下一样使用它:
class AnyService implements IService {
void action(Base base) {
if (base.acceptsFoo()) {
((FooService) base).foo();
}
}
然而,这似乎是一个奇怪的设计。接口旨在提供统一访问,如果您需要区分参数,这几乎总是一个接口的标志,可以分成几个部分......
答案 2 :(得分:1)
定义Foo
和Bar
应实现的界面,以便您可以这样做:
interface Actionable{
public void action;
}
class Base;
class Foo extends Base implements Actionable;
class Bar extends Base implements Actionable;
interface IService {
void action(Actionable a);
}
class FooService implements IService {
void action(Actionable a) {
...
}
}
class BarService implements IService {
void action(Actionable a) {
...
}
}
无论如何,接口应该使您的代码更加健壮和可重用 - 如果您正在研究黑客以使其工作,请考虑更好地设计您的应用程序。
答案 3 :(得分:-1)
您始终可以对特定类型进行类型转换以执行该操作。
void action(Base base)
{
if(base instanceof Foo)
{
Foo foo = (Foo) base;
//executes specific foo action
}
else
{
// handle the edge case where the wrong type was sent to you
}
}
答案 4 :(得分:-2)
如果你传递子类的对象
,任何方式然后行为(实例方法)将被调用对象(子类)传递(多态)
ie.overloaded方法