如何使用派生类对象访问派生类中具有相同名称的基类方法

时间:2018-10-11 22:15:21

标签: c# oop inheritance interface polymorphism

我有一个实现接口的基类,还有一个继承该基类的专门类。

我已经在基类中实现了接口的方法,并将其标记为虚拟的,并且在专门的类中也重写了相同的方法。

现在,我想在某种程度上解析方法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 :(得分:0)

这是我为您的问题提供的唯一解决方案:

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