soh*_*hum 1 c# inheritance memory-management object instantiation
我不确定如何描述这个问题,但是这里有.我有一个在SQLite数据库中映射的对象的类层次结构.我已经编写了所有在.NET对象和数据库之间进行通信的非平凡代码.
我有一个基本界面如下:
public interface IBackendObject
{
void Read(int id);
void Refresh();
void Save();
void Delete();
}
Run Code Online (Sandbox Code Playgroud)
这是任何对象的基本CRUD操作.然后我实现了一个封装了大部分功能的基类.
public abstract class ABackendObject : IBackendObject
{
protected ABackendObject() { } // constructor used to instantiate new objects
protected ABackendObject(int id) { Read(id); } // constructor used to load object
public void Read(int id) { ... } // implemented here is the DB code
}
Run Code Online (Sandbox Code Playgroud)
现在,最后,我有了具体的子对象,每个对象在数据库中都有自己的表:
public class ChildObject : ABackendObject
{
public ChildObject() : base() { }
public ChildObject(int id) : base(id) { }
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这适用于我的所有目的.子进程有几个回调方法,基类使用这些方法来正确实例化数据.
我现在想要提高效率.例如,在以下代码中:
public void SomeFunction1()
{
ChildObject obj = new ChildObject(1);
obj.Property1 = "blah!";
obj.Save();
}
public void SomeFunction2()
{
ChildObject obj = new ChildObject(1);
obj.Property2 = "blah!";
obj.Save();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我将构建两个全新的内存实例化,并且根据被调用的SomeFunction1和SomeFunction2的顺序,可能无法保存Property1或Property2.我想要实现的是这两种实例化以某种方式指向相同内存位置的方式 - 如果我使用"new"关键字,我认为这不可能,所以我一直在寻找提示如何进行.
理想情况下,我想在我的ABackendObject类中存储所有已加载对象的缓存,并在请求时返回对已加载对象的内存引用,或者如果对象尚未存在则从内存加载该对象并将其添加到缓存中.我已经有很多代码已经在使用这个框架了,所以我当然要改变很多东西来实现这个功能,但我只是想知道如何继续.
谢谢!
如果要存储已加载对象的"缓存",则可以轻松地让每个类型维护一个Dictionary<int, IBackendObject>包含加载对象的类型,并按其ID键入.
而不是使用构造函数,构建一个检查缓存的工厂方法:
public abstract class ABackendObject<T> where T : class
{
public T LoadFromDB(int id) {
T obj = this.CheckCache(id);
if (obj == null)
{
obj = this.Read(id); // Load the object
this.SaveToCache(id, obj);
}
return obj;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您使基类具有通用性,并且读取虚拟,则应该能够提供大部分此功能而无需重复代码.
| 归档时间: |
|
| 查看次数: |
995 次 |
| 最近记录: |