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

标签 c# .net inheritance

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

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/

相关文章:

c# - OracleParameter.Size 有什么影响?

c# - ValueTypes 会导致 GC 吗?

c# - 类型推断和继承

c# - Java MD5 哈希与 C# MD5 哈希不匹配

c# - 使用 VSTO 将数据加载到 Microsoft Project 时如何提高性能

java - .NET 中 Guava 服务的替代方案?

Python:扩展列表的正确方法

C++继承/模板问题

c# - 关于数据绑定(bind)集合中使用的可变对象的覆盖 Equals 的持续混淆

c# - 将属性注册为 DependencyProperty