为什么抽象方法没有在以下代码中执行?

时间:2016-09-09 02:31:06

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

我粘贴以下代码:

services.AddDbContext<ApplicationDbContext>(options =>         options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")),ServiceLifetime.Transient);

我无法理解为什么上面的Abstract类没有执行? 上面的代码运行完美,也产生输出。 我的问题是,在调用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)
        {
            Program obj = new Program();
            obj.add(10, 111);
            Console.ReadLine();
        }
    } 

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

 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();
    }
} 

1 个答案:

答案 0 :(得分:2)

这是因为在derive类中声明的任何方法都优先于基本继承方法。

如果要调用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();
    }
}