首页 > 解决方案 > c#让父类方法使用子类变量

问题描述

我一直面临挑战,质疑我对 OOP 的信心。如果可能的话,请告诉我如何:

我有一个带有静态列表的父类(用于跟踪创建的所有对象,主要是出于 UI DataGrid 的原因)和一个引用该列表的方法。类似的东西

abstract class Animal
{
    public static List<Animal> objList;
    public String Name;

    public Animal(String Name)
    {
        this.Name = Name;
        objList.Add(this);
    }

    public virtual void delete(int i)
    {
        objList.RemoveAt(i);
    }

现在我有一个带有静态列表的子类(同名相同目的只是不同的类),但是为了让方法引用 child.list,我必须重写该方法。像那样

class Cat : Animal
{
    public static List<Cat> objList;

    public Cat(String Name) : base(Name)
    {

    }

    //whould it be possible to ommit this method?
    public override void delete(int i)
    {
        objList.RemoveAt(i);
    }
}

这不可能是最好的方法。如果我有 5 个孩子,他们都会粘贴相同部分的代码副本。必须有一种方法,父类“删除”方法,如果从子对象调用,它会从子列表中删除,而不是从父列表中删除。

标签: c#oopinheritance

解决方案


静态属性和方法不适合以 OOP 方式被覆盖,尽管它们可以被遮蔽。

public class Parent : IDisposable
{
    private static List<Parent> objList = new List<Parent>();
    private static IReadOnlyList<Parent> readOnlyList = new ReadOnlyCollection<Parent>(objList);
    public static IEnumerable<Parent> Instances { get { return readOnlyList; } }

    private bool _isDisposed = false;
    public bool IsDisposed {  get { return _isDisposed;  } }

    public Parent()
    {
        objList.Add(this);
    }

    public void Dispose()
    {
        OnDispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void OnDispose(bool disposing)
    {
        if(disposing) { objList.Remove(this); }
        _isDisposed = true;
    }
}

public class Child : Parent
{
    private static IEnumerable<Child> _instances = Parent.Instances.OfType<Child>();
    public new static IEnumerable<Child> Instances { get { return _instances; }}

    public Child() : base()
    {

    }
}

现在,如果您想从列表中删除第 i 个项目,只需使用使用Parent.Instances(i).Dispose();

您还可以通过执行Child.Instances(i).Dispose()删除第 i 个子实例

编辑:按照以下评论中的建议从父级中删除终结器。

Edit2:按照评论中的建议,简化了 Child 类中的 LINQ 表达式以使用 .OfType() 。


推荐阅读