![]() |
1
4
我相信你想要的是:
或者可以添加一个新方法
|
![]() |
2
16
你能换一下吗
添加方法
|
![]() |
3
13
嗯,这取决于
有时候,在另一方面,这是服务本身不应该知道的代码——此时,生活变得更加丑陋:(有时这是 分类 事情真的很难避免。我偶尔会发现泛型和lambda表达式的混合有帮助,例如
哪里
…但我不是真的 幸福的 当我这样做的时候:( |
![]() |
4
9
我喜欢在这些场景中使用字典。
|
![]() |
5
2
至于我,我真的会同意
|
![]() |
6
1
这并不能使它更好地阅读,但可能会更好地执行(如果一个服务不能同时是两种类型):
另一种方法也许这也是一个可能的解决方案:
|
![]() |
7
1
一般来说,如果您认为必须在代码中执行类似的操作,这是一个很强的迹象,表明您的设计有问题。如果你通过
但除此之外。在你的情况下,有一些
托马斯 |
![]() |
8
1
如果功能不属于
后者要求您添加一个新方法
例子:
|
![]() |
9
1
使用多态性,这是一个非常简单的解决方案。
|
![]() |
10
1
假设要根据实际类型执行某个方法,则可以对实例使用getmethod,如果该方法存在,则调用它。
这样您就不必检查类型了,只需检查方法是否存在——有点像在树上走动,所以我希望这种方法是有用的。 您还可以使用可能的方法数组并对它们进行迭代,检查每一个方法并以这种方式使用更优雅的代码。 |
![]() |
11
1
正如其他人所说,最简单的解决方案是通过添加的方法在iService实现内部完成此逻辑。 但是,如果该功能确实不属于iService内部,那么访问者模式将是比大量检查实例更好的解决方案。 您将创建一个类似
它的实现可以处理当前在剂量测量中的逻辑,但是每个分支都被分离成它自己的方法:
然后,IService需要一种添加方法:
它将在特定的实现中实现,例如
与其他实现类似。 然后可以将原始dosomething()方法重写为
这种方法的优点是,您的逻辑将更好地隔离,并且性能稍高,因为它不再使用任何检查或强制转换实例。 另外,如果您添加了一个新的IService实现,编译器将强制您为它添加适当的处理程序(因为它需要实现accept()方法,这只能通过将适当的case添加到IServiceHandler来完成),而对于依赖于数字对于类型检查,很容易忘记添加适当的额外案例。 最后但并非最不重要的是,如果您曾经需要任何其他类型的处理程序,那么您可以这样做而不需要对IService进行任何进一步的更改;您只需使用新的逻辑创建一个新的IServiceHandler实现。 |
![]() |
12
0
如果您自己编写服务类,那么接口就是前进的道路。如果应该在对象上调用foo(),如果它是service1或service2,那么它们应该实现一个公共接口,您只需检查它是否是两者之一,然后运行相关的代码。 但是,如果他们的课程不能改变,那么我认为你运气不好。20+完全不同的类,应该有20+完全不同的逻辑集应用到它们必须简单…以不同的方式处理。 还是我错过了一些魔法?每次看到这样的代码,我都会想到如何实现接口。 |
![]() |
A B · C#Excel自动调整列避免长文本时出错 5 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 5 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 5 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 5 月前 |