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 意味着没有提供方法体,但是从中派生的任何类必须实现此方法(除非它也是抽象的).
我认为这几乎可以回答你的问题....
如果它没有实现,那么它不能是虚拟的,它必须是抽象的.如果它有一个什么都不做的实现那么必须实现.
虚拟类的重点是它具有默认行为,因此您可以选择是否覆盖它.如果它是抽象的,那么你必须覆盖它(除非你派生另一个抽象类).