我的目标是在子类中保留静态位图,并在子类中使用逻辑,而子类中的代码量最少。
目前,我有两个课程:LEDa
,LEDb
,来自LED
。每个子类都需要它自己的一组static
对象(巨大的位图)来防止高ram使用。我将子位图传递给基本方法作为参数,但我希望减少它#34;链接"代码最小化。
我已经找到了一个可能的解决方案,但是看起来非常hacky所以我决定要求第二个意见。我正在考虑将子的静态位图引用传递给基类的实例变量。
class LED{
Bitmap bmp;
Bitmap[] StateBMP;
int state;
public LED(Bitmap bmp){
this.bmp = bmp;
createStateBMPs();
}
}
class LEDa : LED{ //code is identical in LEDb
static Bitmap bmp = .......;
static Bitmap[] StateBMP;
public LEDa():base(bmp){
}
}
如果我得到了正确的话,初始化LEDa
和LEDb
的多个实例只会将2个位图加载到内存中,而LED
中的所有位图都只是连接到1个2位图。
我想知道是否有更好的方法来处理这个问题。
答案 0 :(得分:1)
我认为您尝试实现的是 Singleton ,有很多变体,但最简单的解决方案可能如下所示。
public class LED{
Bitmap bmp;
public LED(Bitmap bmp){
this.bmp = bmp;
}
}
public static class LEDSingleton
{
private static Dictionary<string,LED> LEDs = new Dictionary<string, LED>();
public static LED Instance(string name, Bitmap bmp)
{
if (!LEDs.ContainsKey(name))
{
LEDs.Add(name, new LED(bmp));
}
return LEDs[name];
}
}
你就像这样使用它
var LEDa1 = LEDSingleton.Instance("LEDa", new Bitmap(..));
var LEDb = LEDSingleton.Instance("LEDb", new Bitmap(..));
var LEDa2 = LEDSingleton.Instance("LEDa", new Bitmap(..)); // same instance as LEDa1
注意:
而不是string
名称可以是enum
或其他名称。
在这种情况下,任何IoC(控制反转)容器都可以很好地工作,因为您可以将类配置为单例范围,并且每次获取该类型的实例时,会是一样的。
答案 1 :(得分:1)
我花了不少时间尝试不同的事情来实现目标,并且传递给基类实例对象的静态bmp工作。我唯一担心的是在LED
的每个实例中都有一个不必要的重复对象引用。
根据Stefan的回答,我找到了一种方法(不会导致相同的类对象具有多个相同的引用)。基本上,子类中的静态Bitmap,可以由具有重写属性的基类访问:
class LED{
/*
I used NULL instead of Global.DefaultBitmap, which worked just fine
if you don't leave lose ends, but these classes are actually
Controls and the UserControl test container kept giving me errors
when I scrolled through base control, so I decided to add a static
10x10 image/icon to all base controls to have that instead of errors.
*/
public virtual Bitmap bmp {get {return Global.DefaultBitmap;} set{}}
public LED(){}
}
class LEDa : LED{ //code is identical in LEDb
static Bitmap _bmp;
public override Bitmap bmp{get{return _bmp;}set{_bmp=value}}
public LEDa(){}
}