【问题标题】:Why the abstract method is not executing in the following code?为什么抽象方法没有在以下代码中执行?
【发布时间】:2016-09-09 02:31:06
【问题描述】:

我正在粘贴以下代码:

 abstract public class test
    {
        abstract public void add(int a, int b);

    }

    class Program : test
    {
        public void add(decimal a, decimal b)
        {
            decimal c = a + b;
            Console.WriteLine("Decimal Addition : {0}", c);
        }

        public override void add(int a, int b)
        {
            int c = a + b;
            Console.WriteLine("Addition : {0} ", c);
        }
        static void Main(string[] args)
        {
            Program obj = new Program();
            obj.add(10, 111);
            Console.ReadLine();
        }
    } 

我不明白为什么上面的抽象类没有执行? 上面的代码运行完美,也产生了输出。 我的问题是,即使在调用 add() 方法时仍然在 Program 类中覆盖了抽象方法,为什么非抽象方法正在执行而抽象方法没有?

如果我将程序更改为:

 abstract public class test
{
    abstract public void add(int a, int b);

}

class Program : test
{
    public void add(decimal a, decimal b)
    {
        decimal c = a + b;
        Console.WriteLine("Decimal Addition : {0}", c);
    }

    public override void add(int a, int b)
    {
        int c = a + b;
        Console.WriteLine("Addition : {0} ", c);
    }
    static void Main(string[] args)
    {

        test obj = new Program();
        obj.add(10, 111);
        Console.ReadLine();
    }
} 

然后我的 Abstract 方法正在执行并给我想要的结果。请任何人解释。下面一行中实际发生了什么。我知道这是一个非常基本的问题,但我在这里有点困惑。请帮忙 !提前致谢。

test obj = new Program();

【问题讨论】:

  • 到底发生了什么与您的预期不同?
  • 您的问题是什么?
  • 如上所说,你并没有真正使用你的抽象类。也许您想做test obj = new Program();,这将创建一个新程序但将其作为“测试”
  • 抽象方法不执行。他们没有任何实现。目前还不清楚你的问题是什么。
  • 很抱歉,但我已尽力解释我感到困惑的情况。这可能是 OOPS 中的一个非常基本的概念,但现在我对程序行为感到很困惑。

标签: c# oop abstract-class abstract-methods


【解决方案1】:

这是因为派生类中声明的任何方法都比基继承方法具有更高的优先级。

如果你想调用add(int a, int b),你需要告诉编译器add(decimal a, decimal b) 不存在。这是通过将其转换为 test

abstract public class test
{
    abstract public void add(int a, int b);

}

class Program : test
{
    public void add(decimal a, decimal b)
    {
        decimal c = a + b;
        Console.WriteLine("Decimal Addition : {0}", c);
    }

    public override void add(int a, int b)
    {
        int c = a + b;
        Console.WriteLine("Addition : {0} ", c);
    }
    static void Main(string[] args)
    {
        test obj = new Program();
        obj.add(10, 111);
        Console.ReadLine();
    }
} 

如果不想强制转换,可以在抽象类中声明add(decimal a, decimal b);。 像这样:

abstract public class test
{
    abstract public void add(int a, int b);

    abstract public void add(decimal a, decimal b);
}

public class Program : test
{

    public override void add(int a, int b)
    {
        int c = a + b;
        Console.WriteLine("Addition : {0} ", c);
    }
    public override void add(decimal a, decimal b)
    {
        decimal c = a + b;
        Console.WriteLine("Decimal Addition : {0}", c);
    }
    public static void Main(string[] args)
    {
        Program obj = new Program();
        obj.add(10, 111);
        Console.ReadLine();
    }
}

【讨论】:

  • 感谢@Bob 的快速回复,但是当我执行您的第二个代码时,为什么我只得到加法而不是控制台输出中的“加法”和“十进制加法”?跨度>
  • @Tony 为什么你希望调用两个重载?
  • 你永远不能通过 1 个调用执行两个方法。为此,您需要调用两次。第二个是obj.add(10m, 111m);m 会告诉编译器这是一个小数
  • @Bob 非常感谢。是的,谢谢!
  • 关于为什么选择派生类方法而不是继承方法的原因的详细解释可以在这里找到:stackoverflow.com/questions/26117105/…
猜你喜欢
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 2020-02-04
  • 2020-04-24
  • 2010-11-20
  • 2016-05-16
相关资源
最近更新 更多