gpt4 book ai didi

c# - 继承一个已经实例化的基础对象

转载 作者:行者123 更新时间:2023-11-30 19:49:45 24 4
gpt4 key购买 nike

是否可以做类似下面的事情:

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。

最佳答案

  1. 你不能做 base = o;
  2. 您正在寻找的是 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,它会工作,但你也可以用 BuckleUpCheckMirrors 包裹那辆车,你就不会根本不必更改该方法。您已经使用 Decorator Pattern 通过组合修改了功能.

关于c# - 继承一个已经实例化的基础对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3415357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com