abstract method in a virtual class
我有一个C类,它有很多虚拟方法,其中一些方法本质上是抽象的(它们在子类中完全实现,而基类是空的)。
为了让它编译,我在基类中抛出了一个InvalidOperationException,并对应该做什么进行了注释。这只是感觉脏。
有没有更好的方法来设计我的课程?
编辑:它适用于将在加拿大运行的应用程序的中间层,其中一半方法是通用的,因此是虚拟的。其中一半方法是针对特定省份的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | Public class PersonComponent() { public GetPersonById(Guid id) { //Code to get person - same for all provinces } Public virtual DeletePerson(Guid id) { //Common code } Public virtual UpdatePerson(Person p) { throw new InvalidOperation("I wanna be abstract"); } Public Class ABPersonComponent : PersonComponent { public override DeletePerson(Guid id) { //alberta specific delete code } public override UpdatePerson(Person p) { //alberta specific update codecode } } |
希望这有意义
将基类以及没有实现的方法标记为抽象类。
像这样
1 2 3 4 5 6 7 8 9 10 11 12 13 | public abstract class BaseClass { public abstract void AbstractMethod(); } public class SubClass: BaseClass { public override void AbstractMethod() { //Do Something } } |
抽象类之外不能有抽象方法。将类标记为抽象意味着您将无法实例化它。但这样做毫无意义。对于一个无论如何都不实现方法的类,您打算怎么做?
编辑:从您的类来看,是的,我将使PersonComponent与UpdatePerson方法一起抽象。或者,如果updateperson不为Person组件做任何事情,则保持原样,但为Person组件使updateperson方法为空。
考虑对象层次结构。是否要共享所有派生类的公共代码,然后在基类中实现基本功能。
共享基础代码时,请注意模板模式。使用公共方法并将其链接到具有核心/共享实现的受保护虚拟方法。以"core"结束共享实现方法名。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public abstract class BaseClass { protected virtual void DeletePersonCore(Guid id) { //shared code } public void DeletePerson(Guid id) { //chain it to the core DeletePersonCore(id); } } public class DerivedClass : BaseClass { protected override void DeletePersonCore(Guid id) { //do some polymorphistic stuff base.DeletePersonCore(id); } } public class UsageClass { public void Delete() { DerivedClass dc = new DerivedClass(); dc.DeletePerson(Guid.NewGuid()); } } |