接口,抽象还是虚拟方法?

Xai*_*oft 8 c# oop abstract-class virtual-functions interface

我有一堆系统,让我们打电话给他们A, B, C, D, E, F, G, H, I, J.

它们都有类似的方法和属性.有些包含完全相同的方法和属性,有些可能略有不同,有些可能会有很大差异.现在,我为每个系统都有很多重复的代码.例如,我有一个GetPropertyInformation()为每个系统定义的方法.我试图找出哪种方法是减少重复代码的最佳方法,或者下面的方法之一不是要走的路:

接口

public Interface ISystem
{
    public void GetPropertyInformation();
    //Other methods to implement
}

public class A : ISystem
{
    public void GetPropertyInformation()
    {
       //Code here
    }
}
Run Code Online (Sandbox Code Playgroud)

抽象

public abstract class System
{
    public virtual void GetPropertyInformation()
    {
        //Standard Code here
    }
}

public class B : System
{
   public override void GetPropertyInformation()
   {
      //B specific code here
    }
}
Run Code Online (Sandbox Code Playgroud)

超级基类中的虚方法

public class System
{
   public virtual void GetPropertyInformation()
    {
     //System Code
    }
}

public class C : System
{
  public override void GetPropertyInformation()
  {
      //C Code
  }
}
Run Code Online (Sandbox Code Playgroud)

一个问题,虽然它可能是愚蠢的,让我们假设我采用抽象方法,我想覆盖它GetPropertyInformation,但我需要传递一个额外的参数,这是可能的还是我必须在抽象类中创建另一个方法?例如,GetPropertyInformation(x)

Hen*_*man 6

你的抽象和"超级基础"方法并没有太大的不同.您应始终将基类抽象化,并且您可以提供默认实现(虚拟方法)或不提供(抽象方法).决定因素是你是否想要拥有基类的实例,我想不是.

所以它在基类和接口之间.如果您的A,BC类之间存在强耦合,那么您可以使用基类,可能还有一个常见的实现.

如果A,B,C类自然不属于单个"族",则使用接口.

System没有这样的好名字.

并且在覆盖时无法更改参数列表.也许默认参数可以帮助,否则你只需要2次重载GetPropertyInformation().