3

首先,我正在扩展现有的类结构,并且不能更改原始类结构,但需要注意的是:

我想这样做:

class a
{
   int val;

   ... // usual constructor, etc...

   public int displayAlteredValue(int inp)
   {
     return (val*inp);
   }
}

class b extends a
{
   ... // usual constructor, etc...

   public in displayAlteredValue(int inp1, int inp2)
   {
     return (val*inp1*inp2);
   }
}

正如我之前所说,我无法更改class a,我想保留函数名称displayAlteredValue而不是创建一个新函数。如果可以做到这一点,我只需将 的几个实例更改ab. 我不想花很多时间替换对displayAlteredValue. (是的,我确实意识到存在诸如搜索和替换之类的事情,但是由于其他原因,这样做会有问题)。

有任何想法吗?

4

7 回答 7

3

您可以重载派生类中的函数。所以你上面指定的应该工作。刚刚写了一个快速测试,它工作。

public class DerivedOverload {

    /**
     * @param args
     */
    public static void main(String[] args) {
        A classA = new A(); 

        B classB = new B();

        System.out.println("DerivedOverload.main() classA.displayAlteredValue(2) : " + classA.displayAlteredValue(2));

        System.out.println("DerivedOverload.main() classA.displayAlteredValue(2) : " + classB.displayAlteredValue(2,2));
    }



}


class A
{
   int val = 2;

   A(){

   }

   public int displayAlteredValue(int inp)
   {
     return (val*inp);
   }
}

class B extends A
{
   B(){

   }

   public int displayAlteredValue(int inp1, int inp2)
   {
     return (val*inp1*inp2);
   }
}

系统出。DerivedOverload.main() classA.displayAlteredValue(2) : 4 DerivedOverload.main() classA.displayAlteredValue(2) : 8

于 2008-11-12T20:44:53.280 回答
2

我不清楚问题是什么。您绝对可以创建一个具有相同名称但不同签名的方法的子类 b。

您可能遇到的一个可能问题是编译器需要知道对象的类型是 b,而不是 a,才能调用仅存在于 b 中的方法。

所以这样的代码不起作用:

// this works because b is a subclass of a
a anObject = new b();

// this will not compile because the declared type of anObject is a
int x = anObject.getValue( 1, 2 );

您必须将变量的声明更改为类型 b,或者在您想要调用 2-argument 方法时将其强制转换为 b。

于 2008-11-12T20:46:13.607 回答
1

如果你把它添加到你的派生类怎么办

public int displayAlteredValue(int inp)
{
  return super.displayAlteredValue(inp);
}
于 2008-11-12T20:36:07.213 回答
1

您编写的代码按原样编译。您基本上只是重载了该方法。您发布的代码没有完成什么,您想要完成什么?您是否试图阻止人们使用单个参数调用 b.displayAlteredValue ?如果是这样,你不能这样做(在编译时),因为它会违反 Liskov 的可替代性原则。

你可以抛出一个异常,但这不会非常好。

或者,您可以使用组合而不是继承 - 但实际上我们需要更多地了解这种情况才能知道这是否合适。

于 2008-11-12T20:45:43.357 回答
1

你所拥有的对我来说看起来不错。

b 类的实例可以访问该方法的两个版本。对 1 参数版本的调用将自动路由到 a 类。对 2-arg 版本的调用将转到 b 类。

a 类的实例虽然只能访问 1-arg 版本,但我认为没有办法解决这个问题。

于 2008-11-12T20:45:51.797 回答
1

或者,您可以考虑使用组合而不是继承,因为您要扩展的类来自不同的包。

http://www.artima.com/lejava/articles/designprinciples4.html

于 2008-11-12T21:02:44.120 回答
0

您可以在 B 类中编写代码,如下所示:

public int displayAlteredValue(int inp) 
{
    return -1;
}

并在函数上指出 -1 是错误返回。对于 int 这实际上不起作用,但如果您返回一个类,如果他们调用该方法的单参数版本,您可以返回 null。

于 2008-11-12T20:56:41.807 回答