c# - 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 个孩子,他们都会粘贴相同部分的代码副本。必须有一种方法,父类“删除”方法,如果从子对象调用,它会从子列表中删除,而不是从父列表中删除。
解决方案
静态属性和方法不适合以 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() 。
推荐阅读
- c - 使用 Core Audio 实时生成正弦音
- c# - 使用 yield 作为上下文关键字可能会导致问题
- javascript - Vue动态mapGetters
- python - 如何对文件列表进行排序
- javascript - 在'return throw new Error()'中工作'return'语句
- android - 微调器不显示数据
- ios - 启用 UIButton 的间距或 contentEdgeInsets 时,UIStackViews 自动布局抛出
- python - 如何在 matplotlib 中设置轴不相等?
- nginx - Nginx 301 子域
- list - 输出似乎只测试列表中最后一个的差异函数