C#虚拟和覆盖关键字

use*_*142 7 .net c# asp.net visual-studio

我以为我已经钉了这个,然后我去看看工作中的一些来源,我想知道为什么我从msdn读到的东西和我在源头看到的东西有这么多的矛盾....

我的理解是virtual关键字可以在方法声明中使用,以允许任何派生类覆盖它.

在实现超类的虚方法时,需要在派生类中使用override关键字....

例如:

public abstract class A
{
    public virtual string GetName();
}


public class B:A
{

    //assume there are some defined properties.
    public override string GetName()
    {
        return FirstName;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有几个问题:

1)如果没有实现,是否真的有必要将方法定义为虚拟方法?当然,它可以在不使用虚拟和覆盖的情况下在子类中被覆盖?

2)如果(1)不正确,我是否正确认为必须在子类中使用它来覆盖每个虚方法....

编辑:

你是对的我的代码不会编译...我想知道为什么....我理解你的答案但我看到了这个:

public abstract class RequestHandler<TRequest, TResponse> : RequestHandler, IRequestHandler<TRequest>, IRequestHandler, IDisposable, ITypedRequestHandler
    where TRequest : global::Agatha.Common.Request
    where TResponse : global::Agatha.Common.Response, new()
{
    protected RequestHandler();

    public virtual void AfterHandle(TRequest request);
    public virtual void BeforeHandle(TRequest request);
    public override Response CreateDefaultResponse();
    public TResponse CreateTypedResponse();
    public override Response Handle(Request request);
    public abstract Response Handle(TRequest request);
}
Run Code Online (Sandbox Code Playgroud)

以上不会导致编译器抱怨...

Chr*_*ris 10

首先,上面的代码无效.虚拟方法仍然必须具有默认实现的主体.要做你上面所做的事,你需要使用abstractkeyaord而不是virtual.

abstract 意味着没有提供方法体,但是从中派生的任何类必须实现此方法(除非它也是抽象的).

我认为这几乎可以回答你的问题....

  1. 如果它没有实现,那么它不能是虚拟的,它必须是抽象的.如果它有一个什么都不做的实现那么必须实现.

  2. 虚拟类的重点是它具有默认行为,因此您可以选择是否覆盖它.如果它是抽象的,那么你必须覆盖它(除非你派生另一个抽象类).