1、首先我有这样一个需求:
public class Class1
{
public Class1(Stream stream);
}
我想拿到上述代码中的Stream,上述代码又没有Stream这个属性或者GetStream()这个方法,然后上述代码是外部引用的dll,不可能更改源码,我只能这样:
class Program
{
static void Main(string[] args)
{
var stream = new MemoryStream();
var class1= new Class1(stream);
DoWith(class1, stream);
}
static void DoWith(Class1 class1, Stream stream)
{
//是不是很想直接使用class1.Stream;
//没有这个属性,我只能把stream也传过来
//尤其是我想用this Class1 class1扩展Class1的时候,这种需求更明显
}
}
2、利用base二次封装这个类:
public class Class2: Class1
{
public Stream Stream { get; private set; }
public Class2(Stream stream) : base(stream)
{
Stream = stream;
}
}
然后我就可以这样了:
class Program
{
static void Main(string[] args)
{
var stream = new MemoryStream();
var class2 = new Class2(stream);
DoWith(class2);
}
static void DoWith(Class2 class2)
{
var stream = class2.Stream;
}
}
3、我可能又要思考了,能不能直接把var stream = new MemoryStream();放进构造函数呢,这样我就可以不用传参了?可以:
public class Class2 : Class1
{
public Stream Stream { get; private set; }
public Class2(Stream stream) : base(stream)
{
Stream = stream;
}
//这里关键字要换成this,如果你用base那么Stream = stream;这一步就不执行了
//如果你的需求没这么简单,不是一个简单new就能出来的,封装一个静态函数,或者用委托把,lambda也可以
public Class2() : this(new MemoryStream())
{
}
}
然后我就可以这样了:
class Program
{
static void Main(string[] args)
{
DoWith(new Class2());
}
static void DoWith(Class2 class2)
{
var stream = class2.Stream;
}
}
补充:
如果你没有这种需求,看我的代码可能觉得这有什么用呢?等你碰到了类似需求你就恍然大悟了,原来可以这样写。
此处的base,this都是继承构造函数的,并不支持方法继承,C#好像缺那么个语法,就是方法别名或继承