c# - 如何使用派生类对象访问派生类中具有相同名称的基类方法
问题描述
我有一个实现接口的基类,还有一个继承基类的专用类。
我已经在基类中实现了接口的方法并将其标记为虚拟,在专用类中也覆盖了相同的方法。
现在我想在某种基础上解决方法 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();
}
}
}
解决方案
这是我能为您的问题提出的唯一解决方案:
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();
}
}