.net 实现之间的名称空间差异是否可以通用化/抽象化/重构?
下面是该接口的三个实现。实现.net 实现之间的名称空间差异是否可以通用化/抽象化/重构?,.net,generics,refactoring,performance,theory,.net,Generics,Refactoring,Performance,Theory,下面是该接口的三个实现。实现1和实现2之间的唯一区别是包含ItemWrapper的命名空间。可以使用泛化或其他方法重构吗 interface IItemProvider { object GetItem(Item item); } //1 class SomeNamespaceProvider : IItemProvider { object GetItem(Item item) { return SomeNamespace.ItemWrapper.GetIte
1
和实现2
之间的唯一区别是包含ItemWrapper
的命名空间。可以使用泛化或其他方法重构吗
interface IItemProvider {
object GetItem(Item item);
}
//1
class SomeNamespaceProvider : IItemProvider {
object GetItem(Item item) {
return SomeNamespace.ItemWrapper.GetItem(item);
}
}
//2
class OtherNamespaceProvider : IItemProvider {
object GetItem(Item item) {
return OtherNamespace.ItemWrapper.GetItem(item);
}
}
//3
class TotallyDifferentProvider : IItemProvider {
object GetItem(Item item) {
return DifferentItemRetriever(item);
}
}
从您的描述中,我了解到在类
SomeNamespace.ItemWrapper
和OtherNamespace.ItemWrapper
中有静态方法,它们没有实现IItemProvider
接口。你想把那些静态方法变成实例方法,但你不知道怎么做
如果类SomeNamespace.ItemWrapper
和OtherNamespace.ItemWrapper
不是静态的,则可以显式实现IItemProvider
:
namespace SomeNamespace
{
public class ItemWrapper: IItemProvider
{
public static object GetItem(TaskRunProcessor.Test.Item item)
{
return null;
}
object IItemProvider.GetItem(Item item)
{
return ItemWrapper.GetItem(item);
}
}
}
如果它们必须保持静态或出于任何原因您无法访问代码,我建议您采用一些功能性方法:
public class GenericProvider : IItemProvider
{
private Func<Item, object> m_Retriever;
public GenericProvider(Func<Item,object> retriever)
{
if (retriever == null) throw new ArgumentNullException("retriever");
m_Retriever = retriever;
}
object GetItem(Item item)
{
return m_Retriever(item);
}
}
在这两种解决方案中,都不需要为每个名称空间创建更多的类,例如SomeNamespaceProvider
您在第一个位置拥有的类。这里有一种方法:
abstract class ItemWrapper {
public abstract object GetItem(Item item);
}
class OtherNamespaceItemWrapper : ItemWrapper {
public override object GetItem(Item item) {
return OtherNamespace.ItemWrapper.GetItem(item);
}
}
class SomeNamespaceItemWrapper : ItemWrapper {
public override object GetItem(Item item) {
return SomeNamespace.ItemWrapper.GetItem(item);
}
}
然后:
class NamespaceProvider,其中T:ItemWrapper,new(){
私有只读项目包装器;
公共名称空间提供程序(){
this.itemWrapper=new T();
}
公共对象GetItem(项){
返回此.GetItem(item);
}
}
以及:
class SomeNamespaceProvider:NamespaceProvider{}
类OtherNamespaceProvider:NamespaceProvider{}
对于每个名称空间,这仍然需要一个包装类,对吗?如果您坚持像现在这样使用静态方法,是的。或者你可以使用反射,但这是肮脏的,气味难闻。是的。您需要为每个命名空间创建从NamespaceProvider继承的包装器。你最终会上很多课。例如,您将需要(名称空间x2)类。在我的oppinion事件中,像SomeNamespaceProvider这样的简单类增加了项目的复杂性。
abstract class ItemWrapper {
public abstract object GetItem(Item item);
}
class OtherNamespaceItemWrapper : ItemWrapper {
public override object GetItem(Item item) {
return OtherNamespace.ItemWrapper.GetItem(item);
}
}
class SomeNamespaceItemWrapper : ItemWrapper {
public override object GetItem(Item item) {
return SomeNamespace.ItemWrapper.GetItem(item);
}
}
class NamespaceProvider<T> where T : ItemWrapper, new() {
private readonly ItemWrapper itemWrapper;
public NamespaceProvider() {
this.itemWrapper = new T();
}
public object GetItem(Item item) {
return this.GetItem(item);
}
}
class SomeNamespaceProvider : NamespaceProvider<SomeNamespaceItemWrapper> { }
class OtherNamespaceProvider : NamespaceProvider<OtherNamespaceItemWrapper> { }