亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無接口的密封類的復合模式

無接口的密封類的復合模式

C#
慕斯709654 2023-08-20 14:50:56
假設我正在使用一個我無法控制的庫。該庫公開了需要特定類參數的服務。類被標記為密封且沒有接口。tl;dr:如何將密封類重新實現為接口?代碼示例: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)}");    }}
查看完整描述

2 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

根據您顯示的代碼示例,答案是您不能。您需要能夠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.

    }

}



查看完整回答
反對 回復 2023-08-20
?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

編譯器錯誤信息


無法將類型“MyCode.MyArgumentClass”隱式轉換為“IDontHaveControlOverThis.ArgumentClass”


注意:強調我的


應該給你一個關于你可以做什么的提示


public class MyArgumentClass {

? ? private IDontHaveControlOverThis.ArgumentClass arg = new IDontHaveControlOverThis.ArgumentClass();


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



? ? public static implicit operator IDontHaveControlOverThis.ArgumentClass(MyArgumentClass source) {


? ? ? ? return source.arg;

? ? }

}

所以現在你的“包裝器”根據需要公開了第 3 方依賴項


?IDontHaveControlOverThis.ArgumentClass myArg = new MyCode.MyArgumentClass();

或直接


var myArg = new MyCode.MyArgumentClass();

Console.WriteLine($"Result: {service.ServiceCall(myArg)}");

這可以允許抽象你的代碼


namespace MyCode {


? ? public interface IMyService {

? ? ? ? String ServiceCall(MyArgumentClass argument);

? ? }


? ? public class MyServiceClass : IMyService {

? ? ? ? public string ServiceCall(MyArgumentClass argument) {

? ? ? ? ? ? IDontHaveControlOverThis.ServiceClass service = new IDontHaveControlOverThis.ServiceClass();

? ? ? ? ? ? return service.ServiceCall(argument);

? ? ? ? }

? ? }

}


查看完整回答
反對 回復 2023-08-20
  • 2 回答
  • 0 關注
  • 150 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號