不修改IBook接口Initilize方法,为Books类该方法传参的可行方案
不用修改IBook接口,给Books类的Initialize方法传参的可行方案
嘿,我来给你梳理几种不用改动IBook接口里的Initialize()方法,就能给Books类的这个方法传入参数的实用方案,每个方案都附了代码示例,方便你参考:
1. 构造函数注入参数
这种方式是把需要的参数通过类的构造函数传入,存在私有字段里,然后在Initialize()方法里直接使用这些字段的值。好处是参数在实例化时就确定,适合那些初始化时就需要的固定配置。
public interface IBook { bool Initialize(); } public interface IGoodBook : IBook { string Pages {get; set;} } public class Books : IGoodBook{ private readonly string _configParam; private readonly int _initCount; // 带参数的构造函数 public Books(string configParam, int initCount) { _configParam = configParam; _initCount = initCount; } public string Pages {get; set;} public bool Initialize(){ // 使用构造函数传入的参数 Console.WriteLine($"This is Initialize with config: {_configParam}, count: {_initCount}"); return true; // 补充原代码缺失的返回值 } } // 使用方式 var book = new Books("default-config", 5); book.Initialize();
2. 添加带参数的重载方法
在Books类里新增一个带参数的Initialize重载方法,原来的无参Initialize()可以调用这个重载(比如传入默认值),或者让外部直接调用重载版本。这样既遵守了接口契约,又能传参。
public interface IBook { bool Initialize(); } public interface IGoodBook : IBook { string Pages {get; set;} } public class Books : IGoodBook{ public string Pages {get; set;} // 接口要求的无参方法 public bool Initialize(){ // 调用重载,传入默认参数 return Initialize("default-param", 10); } // 自定义的带参数重载 public bool Initialize(string param1, int param2){ Console.WriteLine($"This is Initialize with param1: {param1}, param2: {param2}"); return true; } } // 使用方式 var book = new Books(); book.Initialize("custom-param", 20); // 直接调用重载 // 或者调用无参版本用默认值 book.Initialize();
3. 先设置类的属性/字段再调用Initialize
给Books类添加需要的公共属性或字段,先给这些属性赋值,再调用Initialize()方法,方法内部读取这些属性的值来处理逻辑。这种方式比较灵活,适合参数需要动态调整的场景。
public interface IBook { bool Initialize(); } public interface IGoodBook : IBook { string Pages {get; set;} } public class Books : IGoodBook{ // 新增用于初始化的属性 public string InitConfig { get; set; } public int MaxRetryTimes { get; set; } public string Pages {get; set;} public bool Initialize(){ // 使用预先设置的属性值 Console.WriteLine($"This is Initialize with config: {InitConfig}, retry times: {MaxRetryTimes}"); return true; } } // 使用方式 var book = new Books(); book.InitConfig = "prod-config"; book.MaxRetryTimes = 3; book.Initialize();
4. 使用可选参数(C# 4.0及以上)
利用C#的可选参数特性,在Books类实现的Initialize()方法里添加可选参数。因为可选参数是语法糖,编译后和无参方法的签名兼容,所以不会违反接口契约。
public interface IBook { bool Initialize(); } public interface IGoodBook : IBook { string Pages {get; set;} } public class Books : IGoodBook{ public string Pages {get; set;} // 添加可选参数,不破坏接口契约 public bool Initialize(string param = "default", int count = 1){ Console.WriteLine($"This is Initialize with param: {param}, count: {count}"); return true; } } // 使用方式 var book = new Books(); book.Initialize(); // 不传参用默认值 book.Initialize("custom", 5); // 传参覆盖默认值
5. 使用委托注入逻辑或参数
如果参数需要外部动态提供,或者初始化逻辑依赖外部方法,可以在Books类里定义一个委托字段,先给委托赋值,再在Initialize()里调用委托获取参数或执行逻辑。
public interface IBook { bool Initialize(); } public interface IGoodBook : IBook { string Pages {get; set;} } // 定义委托类型 public delegate (string Config, int Count) InitParamProvider(); public class Books : IGoodBook{ private InitParamProvider _paramProvider; // 提供设置委托的方法或属性 public void SetParamProvider(InitParamProvider provider) { _paramProvider = provider; } public string Pages {get; set;} public bool Initialize(){ if (_paramProvider != null) { var (config, count) = _paramProvider(); Console.WriteLine($"This is Initialize with config: {config}, count: {count}"); } else { Console.WriteLine("This is Initialize with default settings"); } return true; } } // 使用方式 var book = new Books(); book.SetParamProvider(() => ("delegate-config", 7)); book.Initialize();
内容的提问来源于stack exchange,提问作者Joseph Cenk
相关产品推荐
相关产品推荐

