2

我正在尝试实现一个重载的接口方法。我知道这在 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);

你明白了。我怎么能这样做?

4

5 回答 5

1

这在 Java 中不受支持,并且您违反了 OOP 规则。

于 2013-04-01T11:08:01.457 回答
1

根据您的预期用途,有多种尝试。

如果您对 IService 的调用知道它们可以采用哪种对象,您可以尝试泛型。

interface IService<T extends Base> {
   void action(T foo)
}

和用法:

IService<Foo> fooService = ...
fooService.action(fooObject);

如果不是这种情况,您可以在您的“Base”类中进行一些检查,以便区分您的 IService 接口。

class Base {
   boolean acceptsFoo();
   boolean acceptsBar();
}

你可以像这样使用它:

class AnyService implements IService {
   void action(Base base) {
     if (base.acceptsFoo()) {
        ((FooService) base).foo();
     }
}

然而,这似乎是一个奇怪的设计。接口旨在提供统一访问,如果您需要区分参数,这几乎总是表明接口可以分成几个部分......

于 2013-04-01T11:13:39.300 回答
1

定义一个两者都应该实现的接口FooBar所以你可以这样做:

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) {
    ...
   }
}

无论如何,接口应该使您的代码更加健壮和可重用 - 如果您正在研究如何让它们工作,请考虑更好地设计您的应用程序。

于 2013-04-01T11:14:10.210 回答
-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
    } 
}
于 2013-04-01T11:06:14.240 回答
-2

如果您要传递子类的对象,无论如何

然后将调用对象(子类)的行为(实例方法)传递(多态性)

即重载方法

于 2013-04-01T11:15:22.560 回答