c# - 保留对子类的额外引用或强制转换为子类以调用特定于该子类的方法是更好的做法吗?
问题描述
我有一个对象可以采用通用配置对象的系统(想想享元模式)。我还有一个子类,它采用子类配置对象。
为了访问特定于子类配置对象的属性,是维护对子类的第二个引用还是强制转换为子类更好?
例如
class Base {
public BaseConf Conf;
public Base(BaseConf C) {
Conf = C;
}
}
class Derived : Base {
public DerivedConf DerConf; //Create an extra reference, no casting
public Derived(DerivedConf DC) : base(DC) {
DerConf = DC;
}
public void PrintName() {
Console.WriteLine(DerConf.Name);
}
}
class BaseConf {
public BaseConf() {}
}
class DerivedConf : BaseConf {
public string Name;
public DerivedConf(string n) : base() {
Name = n;
}
}
对比
class Base {
public BaseConf Conf;
public Base(BaseConf C) {
Conf = C;
}
}
class Derived : Base {
public Derived(DerivedConf DC) : base(DC) {}
public void PrintName() {
DerivedConf DerConf = Conf as DerivedConf; //Cast, no extra reference
Console.WriteLine(DerConf.Name);
}
}
class BaseConf {
public BaseConf() {}
}
class DerivedConf : BaseConf {
public string Name;
public DerivedConf(string n) : base() {
Name = n;
}
}
两者都有相同的输出
解决方案
我不想做其中任何一个,你可以通过将Base
take 设为通用来解决这两个问题,如下所示:
class Base<T> where T : BaseConf
{
public T Conf;
public Base(T C)
{
Conf = C;
}
}
class Derived : Base<DerivedConf>
{
public Derived(DerivedConf DC) : base(DC)
{
}
public void PrintName()
{
Console.WriteLine(Conf.Name);
}
}
static void Main(string[] args)
{
var derived = new Derived(new DerivedConf("Foo"));
derived.PrintName(); // Foo
}
推荐阅读
- python - 我可以用 python 服务器但 c++ 客户端建立一个 tcp/ip 套接字吗?
- javascript - 有谁知道为什么我的这段代码没有运行?当我单击提交按钮时,它什么也不做?如果有人可能有想法?
- excel - 有没有办法更改我的 Excel 工作表中基于日期引用另一个工作表的公式?
- python - 停止运行函数并再次调用它
- amazon-web-services - 在单个域上托管多个网站 - 在 aws s3 上的文件夹明智
- python - re.sub 改变被替换的波斯语/阿拉伯语内容的方向
- c++ - 如何在小于 O(n) 的时间复杂度内检查两个 std::vectors 是否相等
- python - 推文中图片的 URL
- c - 我应该如何修复错误“比数据参数更多的 '%' 转换”?
- tensorflow - 为什么 Keras 模型仅使用 imagenet 权重实例化?