2 Интерфейс (i1, i2), 2 абстрактных класса (A: i1, B: i2), один класс (Резюме: i1, i2). Как получить доступ ко всем методам абстрактного класса - PullRequest
0 голосов
/ 16 мая 2019

У меня есть два абстрактных класса 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 голосов
/ 20 мая 2019

Я бы сказал, что вы ничего не получите, имея одно и то же определение в двух разных интерфейсах, и что приведение интерфейсов к конкретным типам не является хорошим подходом. Оба определения в 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();
...