我有一个抽象类类型,我继承来创建新类。作为一个等效的例子,考虑:
public abstract class BaseClass {
public BaseClass(String input)
{
...
}
public abstract void doSomething();
public String getResult()
{
...
}
}
现在我可以覆盖BaseClass并实现“doSomething”来执行不同的操作(例如,反向或大写,如果我真的使用字符串,虽然我不是真的,它只是一个例子)。
最常见的用法是:
BaseClass bc = new ExtendsBaseClass(input);
bc.doSomething();
String result = bc.getResult()
所以我想为此制作一个静态包装方法 我想实施:
public static String doSomethingForResult(String input)
{
BaseClass bc = /*new current type*/;
bc.doSomething();
return bc.getResult();
}
但我不知道该用什么来代替该评论,或者如何使其发挥作用;我不想强制每个实现类重新实现它(如果这在概念上是可能的;因为abstract static
是不允许的。
答案 0 :(得分:2)
静态方法不是多态的,因此不能被继承和覆盖。你想做什么是不可能的。
答案 1 :(得分:2)
为什么在这种情况下你会厌烦静电?
受益于多态并合并doSomething()
和getResult()
。
你最终会得到:
public abstract class BaseClass {
public BaseClass(String input)
{
...
}
public abstract String doSomething();
}
并且您的客户看起来像:
BaseClass bc = new ExtendsBaseClass(input);
String result = bc.doSomething();
通常,在实现构建器模式的特定情况下,定义分离的getResult()
方法会有意义。实际上,有几种不同的方法参与对象构造,最终调用了一种getResult()
方法。
---------------------在您的评论之后------------------ ------ 强>
正如您所说,如果常见的情况是使用doSomething()
跟随getResult()
,并且根据特定的子类,您可以使用模板方法模式:
public abstract class BaseClass {
public BaseClass(String input)
{
// assigments
}
public String process(){ //process is a template method
doSomething();
return getResult();
}
protected abstract void doSomething();
protected abstract String getResult();
}
public class ExtendedClass extends BaseClass {
protected void doSomething(){
//...
}
protected String getResult(){
//....
}
}
您的客户只会调用process()
方法:
BaseClass bc = new ExtendsBaseClass(input);
String result = bc.process();
但请:),尽可能避免静态的东西,它们不会导致良好的面向对象编程。
答案 2 :(得分:0)
所以我想为此创建一个静态包装器方法。
我想我明白为什么你可能想要这样做。您需要一种简单的方法来执行一组通用操作,而无需一次又一次地复制样板代码。但是,正如您现在痛苦地意识到的那样,静态方法在继承层次结构中没有位置。我建议你从各种Apache Commons项目及其XxxUtils类中获取灵感,这些类完全由静态方法组成,并且完全存在于它们所依赖的类的层次结构之外。
考虑FileUtils中的课程Commons IO。它只是静态方法,但它们非常有用。考虑两种方法:
static byte[] readFileToByteArray(File file) // Reads the contents of a file into a byte array.
static String readFileToString(File file) // Reads the contents of a file into a String
一种方法处理文件和字节数组,另一种处理文件和字符串?你怎么知道哪个做了什么 - 因为它使用了一个描述性的名字来解释它。没有继承,实现,多态问题,因为FileUtils完全存在于Files,Strings,byte arrays等的继承层次结构之外。
让我们回到你的假设方法。我将此方法放在一个名为MyUtils - 或BitmapUtils的单独类中,并为有意义的具体类的每个组合创建一个方法。
public static String doSomethingWithExtendsBaseClass(String input)
{
BaseClass bc = new ExtendsBaseClass();
bc.doSomething();
return bc.getResult();
}
public static String doSomethingWithOtherClass(String input)
{
BaseClass bc = new OtherClass();
bc.doSomething();
return bc.getResult();
}
但我不知道该用什么来代替该评论,或者如何使其发挥作用
简单 - 您只需在具有相应名称的方法中直接实例化具体类。
答案 3 :(得分:-1)
我认为你可以在BaseClass
中定义一个静态方法,并使用BaseClass
作为参数将另一个类作为参数传递给它。例如。
public static String doSomethingForResult(String input ,BaseClass bc){
bc.doSomething();
return bc.getResult();
}
然后在ExtendedBaseClass
中,您可以写为:
ExtendedBaseClass extendedBaseObject= new ExtendedBaseClass();
String result = BaseClass.doSomethingForResult("input", extendedBaseObject);
System.out.println(result);