接口方法可以重载吗?

时间:2013-04-01 10:57:16

标签: java oop

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

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

5 个答案:

答案 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)

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

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

答案 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方法