我认为我已经搞定了这个问题,然而当我查看工作中的一些源代码时,我始终在想,为什么我从 MSDN 中读到的内容与我在源代码中看到的矛盾如此之多...
我有几个问题:
1) 如果一个方法没有实现,是否真的需要将其定义为虚拟方法? 不使用virtual和override,在子类中重写它不就行了吗?
2) 如果(1)是不正确的,那么我是否正确地认为每个虚拟方法都必须在使用它的子类中被重写。。。。
编辑:
你说得对,我的代码无法编译... 我想知道为什么....我理解了你们的答案,但是我看到了这个:
上述代码不会导致编译器报错...
我的理解是,在方法声明中可以使用 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;
}
}
我有几个问题:
1) 如果一个方法没有实现,是否真的需要将其定义为虚拟方法? 不使用virtual和override,在子类中重写它不就行了吗?
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);
}
上述代码不会导致编译器报错...
A.GetName()
必须声明主体,因为它没有标记为abstract
、extern
或partial
”)。 - dtb