是否可以做类似下面的事情:
public class ChildClass : BaseClass
{
public ChildClass(BaseClass o)
{
base = o;
}
}
基本上,我想要一种透明的方式来将基类包装在其他功能中。我想到的一个例子是自定义设置提供程序,它透明地审核通过它传递的设置。
public class SettingsAuditor : SettingsProvider
{
public SettingsAuditor(SettingsProvider o)
{
base = o;
}
public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection propvals)
{
// Log the property change to a file
base.SetPropertyValues(context, propvals);
}
}
然后我可以执行以下操作:
mySettingsProvider = new SettingsAuditor(mySettingsProvider);
在传递给原始对象之前,所有更改都将通过重写的 SetPropertyValues
。
我可以使用一个私有(private)的 SettingsProvider
成员,但是我要么不能从 SettingsProvider
继承,要么有一个完整的 SettingsProvider
(base
) 根本没有被使用。
我正在使用 C# 4.0 和 .Net 4.0。
最佳答案
- 你不能做
base = o;
- 您正在寻找的是 Decorator Pattern ),这是一种在运行时组合添加功能的方法(相对于继承)。
无需尝试设置base
,您只需包含内部成员。只要包装器实现与内部对象相同的接口(interface)或基类,就可以传回新的包装器。您可以包装任意数量的装饰器。
考虑:
public interface ICar
{
void Drive();
}
public class Car : ICar
{
public void Drive()
{
Console.WriteLine("vroom");
}
}
public class BuckleUp : ICar
{
ICar car;
public BuckleUp(ICar car) { this.car = car; }
public void Drive()
{
Console.WriteLine("click!");
car.Drive();
}
}
public class CheckMirrors : ICar
{
ICar car;
public CheckMirrors(ICar car) { this.car = car; }
public void Drive()
{
Console.WriteLine("mirrors adjusted");
car.Drive();
}
}
现在假设您有一个方法可以接受 ICar
并告诉它开车。你可以给它一辆 Car
,它会工作,但你也可以用 BuckleUp
和 CheckMirrors
包裹那辆车,你就不会根本不必更改该方法。您已经使用 Decorator Pattern 通过组合修改了功能.
关于c# - 继承一个已经实例化的基础对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3415357/