相关疑难解决方法(0)

虚拟和抽象方法之间的区别

以下是MSDN的一些代码:

// compile with: /target:library 
public class D
{
    public virtual void DoWork(int i)
    {
        // Original implementation.
    }
}

public abstract class E : D
{
    public abstract override void DoWork(int i);
}

public class F : E
{
    public override void DoWork(int i)
    {
        // New implementation.
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释上面的代码关于抽象和虚方法之间的差异?

c#

106
推荐指数
4
解决办法
13万
查看次数

49
推荐指数
4
解决办法
5万
查看次数

一般来说,C#中的每个抽象函数都是虚拟的吗?

我在看Stack Overflow问题抽象函数和虚函数有什么区别?,我想知道每个抽象函数是否应该被认为是C#中的虚函数或者一般?

我对"你必须覆盖/你可以覆盖"对这个问题的回答感到有些困惑.不是C#程序员,我倾向于认为抽象函数只是一个编译时的概念,抽象函数是定义的虚函数,因为你必须提供至少一个,但可以在层次结构的下面提供多个实现.

虚函数也具有编译时维度,因为您不能覆盖非虚函数,但它们主要是运行时概念,因为它"只是"选择基于实际接收器的正确方法实现.

c# oop

22
推荐指数
1
解决办法
6243
查看次数

抽象和虚拟有什么区别?

抽象和虚拟都将在子类中被覆盖,而不是差异.

是虚拟方法有身体和抽象只是一个签名????

c#

9
推荐指数
2
解决办法
1万
查看次数

在类中的所有方法上使用 Virtual 关键字的后果?

我是 TDD 新手,我正在使用它Moq作为我的模拟框架。我正在尝试检查我的类中是否已调用某个方法。该类没有实现任何接口。

 var mockFooSaverService = new Mock<FooSaverService>();
 mockFooSaverService.Verify(service => service.Save(mockNewFoo.Object));
Run Code Online (Sandbox Code Playgroud)

为了使这项工作正常进行,我发现必须将该Save()方法作为一种Virtual方法。

问题:

Virtual仅仅为了使其可测试而对类中的所有方法使用关键字会产生什么后果?

c# tdd moq

7
推荐指数
1
解决办法
921
查看次数

什么时候在C#中使用抽象方法而不是虚方法?

可能重复:
抽象函数和虚函数有什么区别?

使用abstractover virtual方法有什么好处,反之亦然?

抽象方法:

  • 只有抽象类可以包含抽象方法.
  • 派生类也需要实现该方法,并且在类中没有提供任何实现.

虚拟方法:

  • 一个类可以声明这些并且还提供相同的实现.
  • 派生类也需要实现该方法来覆盖它.

c#

6
推荐指数
0
解决办法
3万
查看次数

用虚拟方法覆盖抽象方法

我试图在子类中使用虚方法覆盖抽象类中的抽象方法.我(假设到现在?)了解抽象方法和虚方法之间的区别.

显然我无法做到,但我的问题是......为什么?基于此处接受的答案和以下场景,我只是没有看到问题:

    public abstract class TopLevelParent
    {
        protected abstract void TheAbstractMethod();
    }

    public class FirstLevelChild1 : TopLevelParent
    {
        protected override void TheAbstractMethod()
        {

        }
    }

    public class FirstLevelChild2 : TopLevelParent
    {
        protected virtual override void TheAbstractMethod()
        {
            //Do some stuff here
        }
    }

    public class SecondLevelChild : FirstLevelChild2
    {
        //Don't need to re-implement the method here... my parent does it the way I need.
    }
Run Code Online (Sandbox Code Playgroud)

所以,我所做的就是让一个顶级父级有两个继承子级,另一个继承自其中一个继承子级.同样,根据我在上面发布的链接中接受的答案:

"一个虚函数,基本上就是说看,这里的功能对于子类来说可能是也可能不够好.所以如果它足够好,使用这个方法,如果没有,那么覆盖我,并提供你自己的功能. "

并且第二级子级将从其父级继承虚拟方法,从而满足其最顶层父级的抽象方法的实现要求......问题是什么?

我错过了某些阻碍我对此理解的细节......

c# virtual inheritance abstract

6
推荐指数
1
解决办法
1216
查看次数

使用body来抽象一个方法来覆盖

我有我的Beverage课程,它有一些吸气剂/安装工可以使用饮料的大小.这个程序与装饰器模式有关,所以我想结合一些同名的方法的行为.

我的目的是让一个方法与body允许我获得饮料的大小,但是,我希望能够在子类上覆盖该行为.

总而言之,我想要一种方法:

  • 如果不覆盖,则表现为父类中的方法
  • 如果覆盖,则表现得像编码一样

我所做的是创建一个名为getSizeOfBeverage的方法,其行为类似于我的"旧" getSize,并使getSize "new"方法抽象,因此我可以覆盖它,但我想要一个不暗示新方法名称的解决方案.

这是我的代码:

using System;

namespace Decorator
{
    class Program
    {
        static void Main(string[] args)
        {
            Beverage beverage = new Espresso("small");
            beverage = new Whip(beverage);
            Console.WriteLine(beverage.getDescription() + " $" + beverage.cost());
        }
    }

    abstract class Beverage
    {
      private string description;
      private string size;

      public Beverage()
      {
        setDescription("Unknown beverage");
      }

      public double getCost()
      {
        return cost();
      }

      public abstract double cost();

      public abstract string getDescription();

      public void setDescription(string desc) …
Run Code Online (Sandbox Code Playgroud)

c# oop overriding decorator abstract

2
推荐指数
1
解决办法
1329
查看次数

C# - 为什么虚函数不能覆盖抽象函数?

请考虑以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace TestApp
{
    interface IMammalClass
    {
        string Speak();
    }

    public abstract class absMammalClass : IMammalClass
    {
        public abstract string Speak();
    }

    public class basePetClass : absMammalClass
    {
        public virtual override string Speak()
        {
            return "Make Noise";
        }
    }

    public class DogClass : basePetClass
    {
        public override string Speak()
        {
            return "Bark";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            DogClass spot = new DogClass();
            Console.Out.WriteLine(spot.Speak());
        }
    } …
Run Code Online (Sandbox Code Playgroud)

c#

0
推荐指数
1
解决办法
261
查看次数