Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 虚拟方法与抽象方法的区别_C# - Fatal编程技术网

C# 虚拟方法与抽象方法的区别

C# 虚拟方法与抽象方法的区别,c#,C#,以下是来自以下网站的一些代码: 有人能解释一下上述代码中抽象方法和虚拟方法之间的区别吗?虚拟方法有一个实现,并为派生类提供了重写它的选项。抽象方法不提供实现,并强制派生类重写该方法 因此,抽象方法中没有实际的代码,子类必须重写该方法。虚拟方法可以有代码,这通常是某个东西的默认实现,任何子类都可以使用override修饰符重写该方法,并提供自定义实现 public abstract class E { public abstract void AbstractMethod(int i);

以下是来自以下网站的一些代码:


有人能解释一下上述代码中抽象方法和虚拟方法之间的区别吗?

虚拟方法有一个实现,并为派生类提供了重写它的选项。抽象方法不提供实现,并强制派生类重写该方法

因此,抽象方法中没有实际的代码,子类必须重写该方法。虚拟方法可以有代码,这通常是某个东西的默认实现,任何子类都可以使用
override
修饰符重写该方法,并提供自定义实现

public abstract class E
{
    public abstract void AbstractMethod(int i);

    public virtual void VirtualMethod(int i)
    {
        // Default implementation which can be overridden by subclasses.
    }
}

public class D : E
{
    public override void AbstractMethod(int i)
    {
        // You HAVE to override this method
    }
    public override void VirtualMethod(int i)
    {
        // You are allowed to override this method.
    }
}

首先,您应该知道虚拟方法和抽象方法之间的区别

抽象方法
  • 抽象方法驻留在抽象类中,并且没有主体
  • 必须在非抽象子类中重写抽象方法
虚拟方法
  • 虚方法可以驻留在抽象类和非抽象类中
  • 不必重写派生中的虚方法,但可以重写
  • 虚拟方法必须具有主体…可以由“override关键字”覆盖

抽象方法必须在派生类中进行调用重写,否则会产生编译时错误 在虚拟环境中,你可以覆盖它,也可以不覆盖它,这取决于它是否足够好地使用它

例如:

abstract class twodshape
{
    public abstract void area(); // no body in base class
}

class twodshape2 : twodshape
{
    public virtual double area()
    {
        Console.WriteLine("AREA() may be or may not be override");
    }
}

抽象方法:

public abstract class baseclass
        {
            public abstract decimal getarea(decimal Radius);

            public virtual decimal interestpermonth(decimal amount)
            {
                return amount*12/100;
            }

            public virtual decimal totalamount(decimal Amount,decimal principleAmount)
            {
                return Amount + principleAmount;
            }
        }

        public class derivedclass:baseclass
        {
            public override decimal getarea(decimal Radius)
            {
                return 2 * (22 / 7) * Radius;
            }

            public override decimal interestpermonth(decimal amount)
            {
                return amount * 14 / 100;
            }
        }
  • 如果在类中定义了抽象方法,则该类应 声明为抽象类

  • 抽象方法应仅包含方法定义,而不应包含 包含方法体/实现

    public abstract class E
    {
        public abstract void AbstractMethod(int i);
    
        public virtual void VirtualMethod(int i)
        {
            // Default implementation which can be overridden by subclasses.
        }
    }
    
    public class D : E
    {
        public override void AbstractMethod(int i)
        {
            // You HAVE to override this method
        }
        public override void VirtualMethod(int i)
        {
            // You are allowed to override this method.
        }
    }
    
  • 抽象方法必须在派生类中优先使用

虚拟方法:

public abstract class baseclass
        {
            public abstract decimal getarea(decimal Radius);

            public virtual decimal interestpermonth(decimal amount)
            {
                return amount*12/100;
            }

            public virtual decimal totalamount(decimal Amount,decimal principleAmount)
            {
                return Amount + principleAmount;
            }
        }

        public class derivedclass:baseclass
        {
            public override decimal getarea(decimal Radius)
            {
                return 2 * (22 / 7) * Radius;
            }

            public override decimal interestpermonth(decimal amount)
            {
                return amount * 14 / 100;
            }
        }
  • 虚拟方法可以在派生类中使用,但不能在派生类中使用 强制性的
  • 虚拟方法必须具有方法体/实现 根据定义
示例:

public abstract class baseclass
        {
            public abstract decimal getarea(decimal Radius);

            public virtual decimal interestpermonth(decimal amount)
            {
                return amount*12/100;
            }

            public virtual decimal totalamount(decimal Amount,decimal principleAmount)
            {
                return Amount + principleAmount;
            }
        }

        public class derivedclass:baseclass
        {
            public override decimal getarea(decimal Radius)
            {
                return 2 * (22 / 7) * Radius;
            }

            public override decimal interestpermonth(decimal amount)
            {
                return amount * 14 / 100;
            }
        }

你的具体问题是什么,你还不明白什么?你从@DanielHilgarth复制的每一件东西都更新了我的问题。请看一看。@Anandkumar我只复制了抽象类和类成员代码部分。看一看,放得漂亮!但是有一个问题……对于子类中的抽象方法,您是否必须显式地声明
override
[因为它是必须被覆盖的]?对于抽象方法,您必须显式地声明它,是的。对于虚拟方法,它更复杂。如果不在此处声明
override
关键字,则原始方法将被隐藏。如果这是您的意图,您可以使用
new
关键字来消除警告,但是想要隐藏方法的情况非常罕见。因此,除非您特别想使用方法隐藏,否则您应该始终使用
override
关键字我们如何在类E之外调用类E虚拟方法?@Jaydeep Shil您不能,也不应该。如果D重写虚拟方法,则意味着该代码应该从外部使用。如果E VirtualMethod()具有实现,则意味着它具有用法,否则可以声明为抽象。抽象方法必须在非抽象子类中重写。它不是那样的,您也可以在抽象类中重写它。