【问题标题】:Accessing virtual method from abstract class using repository pattern使用存储库模式从抽象类访问虚拟方法
【发布时间】:2019-12-23 09:01:51
【问题描述】:

我一直在理解 - 如何访问和使用(或者甚至可以使用)基类虚拟方法。

所以代码是: 基类:

public abstract class Vehicle
{
    public string VehicleIdentificationNumber { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
    public abstract string DisplayName { get; }

    public virtual bool HasAnAmazingColor(){         
    }
}

存储库模式:

public class VehicleRepository : IVehicleRepository, ICollection
{
    private readonly List<Vehicle> _vehicles;

    public int Count => _vehicles.Count;

    public object SyncRoot => ((ICollection)_vehicles).SyncRoot;

    public bool IsSynchronized => ((ICollection)_vehicles).IsSynchronized;

    public void CopyTo(Array array, int index)
    {
        ((ICollection)_vehicles).CopyTo(array, index);
    }

    public IEnumerator GetEnumerator()
    {
        return ((ICollection)_vehicles).GetEnumerator();
    }

    public VehicleRepository(List<Vehicle> aVehicles)
    {
        _vehicles = aVehicles;
    }

然后 int unittest 我尝试获取虚拟方法,但知道我不了解某些内容,但无法弄清楚是什么,如何在不覆盖它的情况下使用该方法?

  [TestClass()]
public class VehicleRepositoryTests
{

    private VehicleRepository vehicleList = new VehicleRepository(new List<Vehicle>());

    [TestMethod()]
       public void HasAmazingColor()
    {
        //arrange

        //act
        vehicleList.??? -- I'm missing something 

        //assert           
    }

我可以在任何实现 Vehicle 的派生类中访问虚方法,但是有没有办法在存储库模式中使用它?

【问题讨论】:

  • 你试图访问什么方法? VehicleRepository 不是从 Vehicle 派生的,因此您不会尝试访问其中一种方法。我看不到您实施的任何方式可以直接访问存储库中包含的Vehicle 对象(除了将它们复制出来)。
  • 我正在尝试访问公共虚拟 bool HasAnAmazingColor()。
  • 所以你需要一个派生自Vehicle 的实例来访问它的一个虚拟方法,对吧?尽可能清楚地说明这一点:VehicleRepository 不是从Vehicle 派生的,因此它没有Vehicle 的基类的任何方法,因为它不是Vehicle
  • 您是否打算做类似vehicleList.FirstOrDefault().HasAnAmazingColor 之类的事情,因为您正试图让您的回购看起来像一个集合?请注意,您仍然需要将其设为类型安全的集合
  • 哦,等一下,当您不处理数据库时,为什么将其称为“存储库模式”?为什么不把你的代码改成public class VehicleRepository : List&lt;Vehicle&gt; { ... }

标签: c# oop inheritance virtual-functions


【解决方案1】:

嗯,你有抽象的碱基调用Vehicle

仔细观察你的代码,我发现你没有从Vehicle派生你的VehicleRepository类。

因此,您将无法从 Vehicle 访问 VehicleRepository 实例上的虚拟方法。

您正在寻找的方法HasAmazingColor 将在List&lt;Vehicle&gt; _vehicles; 中的每个对象上都可用

也许您可以将车辆列表公开为属性,然后在单元测试中使用它,以防万一您想使用它。

或者

如果您的设计不允许将_vehicles 公开为公共集合,那么您可以在VehicleRepository 类中有一个公共方法,该方法在适当的Vehicle 对象或对象上内部调用HasAmazingColor 方法。

解决方案将取决于您的应用程序设计。

【讨论】:

  • 这只是观察。它将在 List 的每一项上都可用。我将更新答案以明确提及这一点。
猜你喜欢
  • 2010-10-11
  • 2023-03-15
  • 2016-04-20
  • 2016-12-05
  • 2019-07-09
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
相关资源
最近更新 更多