Как я могу получить доступ к методу базового класса с тем же именем в производном классе, используя объект производного класса - PullRequest
0 голосов
/ 12 октября 2018

У меня есть базовый класс, реализующий интерфейс, и, кроме того, специализированный класс, наследующий базовый класс.

Я реализовал метод интерфейса в базовом классе и пометил его как виртуальный, а также переопределил этот же метод в специализированном классе.

Теперь я хочу разрешить метод GetData () на некоторой основе, чтобы он возвращал метод базового класса или метод дочернего класса.

Так в принципе, как я могу вызвать метод базового класса, используя ссылку на специализированный класс или ссылку на интерфейс?

Редактировать 1 У меня есть существующий поставщик данныхи я хочу сохранить его функциональность как есть и хочу использовать некоторый подкласс или класс-обертку, где я могу написать новую реализацию (другого провайдера), помните, что я хочу продолжать работать с существующим провайдером, как для существующего сценария, так и для нового провайдерадля других сценариев).что если я использую шаблон декоратора, чтобы решить это?Любой другой шаблон, который может решить эту проблему?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    interface IDataProvider
    {
        void GetData();
    }

     abstract class StandardDataProvider : IDataProvider
    {
        public virtual void GetData()
        {
            Console.WriteLine("GetData_StandardDataProvider");
        }
    }

    class ManagedDataProvider : StandardDataProvider
    {

        public override void GetData()
        {
            Console.WriteLine("GetData_ManagedDataProvider");
        }

    }


    class Program
    {
        static void Main(string[] args)
        {       

            IDataProvider dataprovider = new  ManagedDataProvider();

            dataprovider.GetData();

            Console.ReadLine();
        }
    }
}

1 Ответ

0 голосов
/ 12 октября 2018

Это единственное решение, которое я мог бы предложить для вашей проблемы:

interface IDataProvider
{
    void GetData();
}

abstract class StandardDataProvider : IDataProvider
{
    public virtual void GetData()
    {
        Console.WriteLine("GetData_StandardDataProvider");
    }
}

class ManagedDataProvider : StandardDataProvider
{

    public override void GetData()
    {
        Console.WriteLine("GetData_ManagedDataProvider");
    }

    public void GetBaseData()
    {
        base.GetData();
    }
}



class Program
{
    static void Main(string[] args)
    {

        IDataProvider dataprovider = new ManagedDataProvider();

        dataprovider.GetData();
        if (dataprovider is ManagedDataProvider)
            {
                (dataprovider as ManagedDataProvider).GetBaseData();
            }


        Console.ReadLine();
    }
}

Еще один способ атаковать это добавить GetBaseData в интерфейс.

interface IDataProvider
{
    void GetData();
    void GetBaseData();
}

abstract class StandardDataProvider : IDataProvider
{
    public virtual void GetData()
    {
        Console.WriteLine("GetData_StandardDataProvider");
    }

    public virtual void GetBaseData()
    {
        Console.WriteLine("GetData_StandardDataProvider");
    }
}

class ManagedDataProvider : StandardDataProvider
{

    public override void GetData()
    {
        Console.WriteLine("GetData_ManagedDataProvider");
    }

    public override void GetBaseData()
    {
        base.GetData();
    }
}



class Program
{
    static void Main(string[] args)
    {

        IDataProvider dataprovider = new ManagedDataProvider();

        dataprovider.GetData();
        dataprovider.GetBaseData();            

        Console.ReadLine();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...