【问题标题】:Can a subclass override a method and have different parameters?子类可以覆盖方法并具有不同的参数吗?
【发布时间】:2015-03-05 21:16:02
【问题描述】:

我想在多个子类中有一个方法,它基本上可以完成某件事(比如获取用户信息),但在主类中声明(并且具有与主类不同的参数和定义)。这可能吗?

我知道这并不是真正的压倒一切,但可以这样做还是不适合构造方法?

【问题讨论】:

  • 如果新方法有不同的参数,那么它就是重载,而不是覆盖。子类可以做到这一点,不会有任何问题。
  • @Downvoter 想发表评论吗?
  • @LuiggiMendoza 如果被覆盖的方法将参数类型替换为其子类型怎么办?
  • @LuiggiMendoza 今天我使用@Override 注释尝试了这些场景:1) 将参数类型替换为其子类 - 不允许 3) 将返回类型替换为其子类 - 允许
  • @valijon 我的错。没错,使用子类作为参数是重载而不是覆盖。您可以在 JLS 中验证这些规则:Override 和 Overloading

标签: java c# oop


【解决方案1】:

你想要做的就是重载一个方法。这是可行的并且经常发生。 Play with the fiddle here.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"));
    }
}

【讨论】:

    【解决方案2】:

    你可以有多个版本的同名方法具有不同数量的参数。您可以在主/父类中拥有所有这些,也可以仅在子类中添加较新的版本。这样做没有限制。

    【讨论】:

      【解决方案3】:

      如 cmets 和其他答案中所述,您可以在子类中定义与其超类中的方法同名的方法,但不能完全覆盖它。这两种方法仍然存在,因此称为重载。在Java 和C Sharp 中,它的工作原理几乎相同;您只需定义一个具有不同参数的新方法。但是,您不能只更改返回类型。方法的参数必须不同才能重载一个。 Here 是一篇关于 Java 中的重载与覆盖的文章。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多