简介:如果我在构造函数初始化器中创建一个对象,如何保留对它的引用,以便稍后引用它?
细节:
我有一个类(LibBase
,下面)需要一个StreamWriter
作为其构造参数.我没有源代码LibBase
- 它在第三方库中.
public class LibBase
{
public LibBase(System.IO.StreamWriter wtr) { ... }
}
Run Code Online (Sandbox Code Playgroud)
我MyClass
从构造函数中派生出来,LibBase
并MyClass
希望将MyWriter
(派生形式StreamWriter
)的实例传递给基类.我这样做如下.
public class MyWriter : System.IO.StreamWriter
{
public MyWriter(int n) { ... }
// Contains unmanaged resources
}
public class MyClass : LibBase
{
public MyClass(int n)
: LibBase(new MyWriter(n))
{ }
}
Run Code Online (Sandbox Code Playgroud)
问题是MyWriter
需要处理,所以MyClass
应该配置它(并实现IDisposable
这样做)但MyClass
没有对创建的MyWriter
实例的引用,所以我不能处理它.构造函数初始化程序的语法似乎不允许我保留引用.
我的解决方案是重新编码MyClass
如下:
public class MyClass : LibBase, IDisposable
{
public MyClass(Encoding enc)
: this(new MyWriter(enc))
{ }
private MyClass(MyWriter wtr)
: LibBase(wtr)
{ this.wtr = wtr; } // store reference
private MyWriter wtr;
// (implement IDisposable using wtr member variable
}
Run Code Online (Sandbox Code Playgroud)
私有构造函数存储对MyWriter
实例的引用,以便稍后处理它.
我的问题:
我不认为你在这里遗漏任何东西.你的解决方案看起来不错,如果 LibBase
真的不让你得到你传递给构造函数的作者.
我怀疑没有更明确支持的原因是它不会经常出现.如果您发现它在设计中经常出现,那么您可能会过度使用继承.
要引导埃里克利珀:
但是,正如我经常指出的那样,我没有必要提供不做功能的理由.功能不便宜; 它们非常昂贵,而且它们不仅要证明自己的成本是合理的,而且必须证明没有完成我们本可以用这个预算完成的其他一百个功能的机会成本.我们必须证明我们的利益相关者的功能成本合理,但我们不需要通过不实现不符合我们标准的功能来节省时间和精力.
我猜这是一个不符合标准的东西,即使它首先被认为是可取的.(C#团队的成本超出了成本 - C#开发人员承担了每个功能的精神成本,并且每个新功能的持续成本使得添加下一个功能变得更加困难.)
归档时间: |
|
查看次数: |
145 次 |
最近记录: |