gpt4 book ai didi

c# - 没有接口(interface)的密封类的复合模式

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

假设我正在使用一个我无法控制的库。该库公开需要特定类参数的服务。类被标记为密封并且没有接口(interface)

tl;dr:如何将密封类重新实现为接口(interface)

代码示例:

using System;

namespace IDontHaveControlOverThis
{
// Note no interface and the class is being sealed
public sealed class ArgumentClass
{
public String AnyCall() => "ArgumentClass::AnyCall";
}

public sealed class ServiceClass
{
public String ServiceCall(ArgumentClass argument) => $"ServiceClass::ServiceCall({argument.AnyCall()})";
}
}

namespace MyCode
{
// Composite pattern, basically I need: "is a ArgumentClass"
// Obviously doesn't work - can't extend from sealed class
public class MyArgumentClass : IDontHaveControlOverThis.ArgumentClass
{
private IDontHaveControlOverThis.ArgumentClass arg = new IDontHaveControlOverThis.ArgumentClass();

public String AnyCall() => $"MyArgumentCLass::AnyCall({arg.AnyCall()})";
}
}

public class Program
{
public static void Main()
{
// I don't have control over this
IDontHaveControlOverThis.ServiceClass service = new IDontHaveControlOverThis.ServiceClass();


//This obviously works
IDontHaveControlOverThis.ArgumentClass arg = new IDontHaveControlOverThis.ArgumentClass();
Console.WriteLine($"Result: {service.ServiceCall(arg)}");

// How to make this work?
IDontHaveControlOverThis.ArgumentClass myArg = new MyCode.MyArgumentClass();
Console.WriteLine($"Result: {service.ServiceCall(myArg)}");
}
}

最佳答案

根据您展示的代码示例,答案是您不能。您需要能够通过设置属性或创建具有不同构造函数参数的新实例来修改 IDontHaveControlOverThis.ArgumentClass 的行为,以便修改服务调用。 (它现在总是返回相同的字符串,所以服务调用总是相同的)

如果您能够通过设置属性来修改 ArgumentClass 的行为。您可以在自己的代码中为密封类创建包装器,并在整个代码库中使用它。

public class MyArgumentClass
{
// TODO: Set this to a useful value of ArgumentClass.
internal IDontHaveControlOverThis.ArgumentClass InnerArgumentClass { get; }
public virtual string AnyCall() => "???";
}

public class MyServiceClass
{
private IDontHaveControlOverThis.ServiceClass innerServiceClass
= new IDontHaveControlOverThis.ServiceClass();

public virtual string ServiceCall(MyArgumentClass argument)
{
return innerServiceClass.ServiceCall(argument.InnerArgumentClass);
}
}

public class MyArgumentClass
{
public virtual string AnyCall() => "???";
}

public class MyServiceClass
{
private IDontHaveControlOverThis.ServiceClass innerServiceClass
= new IDontHaveControlOverThis.ServiceClass();

public string ServiceCall(MyArgumentClass argument)
{
var serviceArgument = Convert(argument);
return innerServiceClass.ServiceCall(serviceArgument);
}

private IDontHaveControlOverThis.ArgumentClass Convert(MyArgumentClass argument)
{
// TODO: implement.
}
}

关于c# - 没有接口(interface)的密封类的复合模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57442054/

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