2个接口(i1,i2),2个抽象类(A:i1,B:i2),一个类(摘要:i1,i2)。如何访问抽象类的所有方法

时间:2019-05-16 11:43:04

标签: c# design-patterns interface abstract-class

我有两个抽象类IExcelHelper和ICoreExcelHelper,它们由ExcelHelper和CoreExcelHelper继承。我有一个继承两个接口的类:IExcelHelper和ICoreExcelHelper。无论方法是否未实现,我都想访问抽象类的所有方法。在这里,我无法访问ExcelHelper的测试方法。

有什么建议吗?

public interface IExcelHelper
{
    void GenerateReport();
}
public interface ICoreExcelHelper
{
    void GenerateReport();
}

public abstract class ExcelHelper : IExcelHelper
{
    public abstract void GenerateReport();

    public void Test()
    {
        Console.WriteLine("Test");
    }
}

public abstract class CoreExcelHelper : ICoreExcelHelper
{
    public abstract void GenerateReport();
}

public class GenerateExcelStrategySummary : IExcelHelper, ICoreExcelHelper
{
    void IExcelHelper.GenerateReport()
    {
        Console.WriteLine("GenerateReport");
    }

    void ICoreExcelHelper.GenerateReport()
    {
        Console.WriteLine("CoreGenerateReport");
    }
}

class Program
{
    static void Main(string[] args)
    {
        IExcelHelper obj = new GenerateExcelStrategySummary();
        obj.GenerateReport();

        obj.Test();

        ICoreExcelHelper obj1 = new GenerateExcelStrategySummary();
        obj1.GenerateReport();

        Console.WriteLine("Hello World!");
        Console.ReadLine();
    }
}

1 个答案:

答案 0 :(得分:0)

我认为,通过在两个不同的接口中使用相同的定义并不能真正获得任何收益,将接口转换为具体类型并不是一个好方法。 IExcelHelper ICoreExcelHelper 中的两个定义将执行相同的基本操作,即生成报告,但是方式不同。我将定义一个报表接口,并让策略对象返回一个实例或将一个实例作为依赖项。使用接口的功能是能够对行为而不是具体的类型进行编码。

public interface IGenerateReport {
  void GenerateReport();
  void Test();
}

public abstract class HelperBase : IGenerateReport {

  public abstract void GenerateReport();

  public void Test() {
    Console.WriteLine("Test");
  }

}

public class ExcelHelper : HelperBase {

  public override void GenerateReport() 
  {
    //I generate my report this way
  }

}

public class CoreHelper : HelperBase {

  public override void GenerateReport() 
  {
    //I will generate my report in a totally different way
  }

}

这将使您可以将类型定义为 HelperBase IGenerateReport ,并且可以访问所有方法。

IGenerateReport helper = new ExcelHelper();
helper.Test();
helper.GenerateReport();

helper = new CoreHelper();
helper.Test();
helper.GenerateReport();

HelperBase helper2 = new ExcelHelper();
helper2.Test();
helper2.GenerateReport();