一个子类可以覆盖一个方法并且有不同的参数吗?

5
我希望在多个子类中有一个方法,它可以完成某些事情(比如获取用户信息),但是它的定义、参数与主类不同。这样做是否可行?
我知道这并不是真正的覆盖,但这样做是否可行或者说这不是一种合适的方法来构建方法?

4
如果新方法具有不同的参数,则为重载,而不是覆盖。子类可以这样做,不会有任何问题。 - Luiggi Mendoza
1
@Downvoter 有什么评论吗? - Shaun Luttin
@LuiggiMendoza 如果重写的方法将参数类型替换为其子类型,会怎样? - valijon
@LuiggiMendoza 今天我尝试使用 @Override 注解执行以下场景: 1)将参数类型替换为其子类 - 不允许 3)将返回类型替换为其子类 - 允许 - valijon
1
@valijon 不好意思,你是对的,使用子类作为参数是重载而不是覆盖。您可以在JLS中验证这些规则:覆盖重载 - Luiggi Mendoza
3个回答

6
你想做的是方法重载。这是可行的,经常发生。在Java中也是类似的。在这里试试。
public class Parent
{        
    public virtual string HelloWorld()
    {
        return "Hello world";
    }

    public string GoodbyeWorld()
    {
        return "Goodbye world";
    }
}

public class Child : Parent
{
     // override: exact same signature, parent method must be virtual
    public override string HelloWorld()
    {
        return "Hello World from Child";
    }

     // overload: same name, different order of parameter types
    public string GoodbyeWorld(string name)
    {
        return GoodbyeWorld() + " from " + name;
    }
}

public class Program
{
    public static void Main()
    {
        var parent = new Parent();
        var child = new Child();
        Console.WriteLine(parent.HelloWorld());
        Console.WriteLine(child.HelloWorld());
        Console.WriteLine(child.GoodbyeWorld());
        Console.WriteLine(child.GoodbyeWorld("Shaun"));
    }
}

0

你可以拥有同名但参数数量不同的多个方法版本。这些方法可以全部放在主/父类中,或者只将新版本添加到子类中。对此没有任何限制。


0

如评论和其他答案中所述,您可以在子类中定义与其超类中的方法同名的方法,但实际上您不能覆盖它。两种方法仍然存在,因此称为重载。在JavaC Sharp中,它的工作方式基本相同;您只需使用不同的参数定义一个新方法。但是,您不能仅更改返回类型。必须使用不同的方法参数才能重载一个方法。这里有一篇关于Java中重载与覆盖的文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接