C#如何向类/委托添加辅助功能?

时间:2011-07-07 05:06:44

标签: c# oop interface delegates

这可能会成为新手问题,尽可能简单,但无论如何我都会放弃。我来自JavaScript背景,所以不确定C#(和其他OOP语言)是否有内置任何东西来解决这个问题。

我想使用接口和放大器为我的类添加辅助功能。实现委托分离具体类,以便可以重用它们。

在以下实现中,我使用外部API的“LibraryClass”,我无法修改。我正在编写“MyClass”,通过扩展它来使用它。

public class LibraryClass {...}

public class MyClass : LibraryClass {...}

现在我想添加诸如分页之类的功能。所以我做了什么,我创建了新的“Paging”类,扩展了“LibraryClass”&扩展了“MyClass”。

当前实施

public class LibraryClass {...}

public class Paging : LibraryClass {
    protected int pageNumber = 1;

    public void setPaging(TRequest request) {
        var httpReq = this.RequestContext.Get<IHttpRequest>();
        pageNumber = httpReq.QueryString["page"]; // parsing syntax skipped
    }
}
public class MyClass : Paging {
    public override object OnGet(Products request) {
        setPaging(request);
        return new ProductsResponse { Products = GetAll() };
    }

    private List<Product> GetAll() {
        // Use base.pageNumber to pull appropriate data
    }
}

这可以通过接口或任何其他C#机制更清洁吗?

建议实施

public class LibraryClass {...}
public interface IPaging : LibraryClass {
    void setPaging(TRequest request)
}
public interface Paging : IPaging {
    public void setPaging(TRequest request) {
        var httpReq = this.RequestContext.Get<IHttpRequest>();
        pageNumber = httpReq.QueryString["page"]; // parsing syntax skipped
    }        
}
public class MyClass : IPaging {...}

我还想为MyClass添加更多“具体”功能,例如access&amp;将实现委托给另一个类。

public interface IAuth {...}
public class Auth : IAuth {...}
public class MyClass : IPaging, IAuth {...}

这里的关键是代码分离。

我可能在学校里错过了一些基本的OOP课程,但我猜它从来都没用过。

2 个答案:

答案 0 :(得分:1)

我想知道你要找的是对象组合,以便某些对象由具有特定功能的较小对象组成 - 请参阅http://en.wikipedia.org/wiki/Object_composition

然后使用Dependency Injection使这很简单。 Which .NET Dependency Injection frameworks are worth looking into?

更多阅读

答案 1 :(得分:0)

如果您不需要LibraryClass的所有功能,则只需创建wrapper即可。 Encapsulate它在一个类中,只展示你想要的东西。

public class LibraryClassWrapper
{
   private LibraryClass _libraryClass = new LibraryClass();
   public void MyFoo()
   {
      // do something... then call a method in the LibraryClass (if required)
      _libraryClass.Foo();
   }
}

然后,您可以在其他界面中分离其他功能,并从中继承您的MyClass对象。

public interface IAuth {...}
public interface IPaging {...}
public class MyClass : LibraryClassWrapper, IPaging, IAuth {...}

请记住,您不能从接口中的具体类继承。 C#仅支持多接口继承。类只能从一个具体类和多个接口继承。