关于c#:虚拟类中的抽象方法

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());
    }
}