以下是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)
任何人都可以解释上面的代码关于抽象和虚方法之间的差异?
我在看Stack Overflow问题抽象函数和虚函数有什么区别?,我想知道每个抽象函数是否应该被认为是C#中的虚函数或者一般?
我对"你必须覆盖/你可以覆盖"对这个问题的回答感到有些困惑.不是C#程序员,我倾向于认为抽象函数只是一个编译时的概念,抽象函数是定义的虚函数,因为你必须提供至少一个,但可以在层次结构的下面提供多个实现.
虚函数也具有编译时维度,因为您不能覆盖非虚函数,但它们主要是运行时概念,因为它"只是"选择基于实际接收器的正确方法实现.
我是 TDD 新手,我正在使用它Moq作为我的模拟框架。我正在尝试检查我的类中是否已调用某个方法。该类没有实现任何接口。
var mockFooSaverService = new Mock<FooSaverService>();
mockFooSaverService.Verify(service => service.Save(mockNewFoo.Object));
Run Code Online (Sandbox Code Playgroud)
为了使这项工作正常进行,我发现我必须将该Save()方法作为一种Virtual方法。
问题:
Virtual仅仅为了使其可测试而对类中的所有方法使用关键字会产生什么后果?
可能重复:
抽象函数和虚函数有什么区别?
使用abstractover virtual方法有什么好处,反之亦然?
抽象方法:
虚拟方法:
我试图在子类中使用虚方法覆盖抽象类中的抽象方法.我(假设到现在?)了解抽象方法和虚方法之间的区别.
显然我无法做到,但我的问题是......为什么?基于此处接受的答案和以下场景,我只是没有看到问题:
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)
所以,我所做的就是让一个顶级父级有两个继承子级,另一个继承自其中一个继承子级.同样,根据我在上面发布的链接中接受的答案:
"一个虚函数,基本上就是说看,这里的功能对于子类来说可能是也可能不够好.所以如果它足够好,使用这个方法,如果没有,那么覆盖我,并提供你自己的功能. "
并且第二级子级将从其父级继承虚拟方法,从而满足其最顶层父级的抽象方法的实现要求......问题是什么?
我错过了某些阻碍我对此理解的细节......
我有我的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) 请考虑以下代码:
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)