C # Как добавить вспомогательную функциональность в класс / делегирование? - PullRequest
0 голосов
/ 07 июля 2011

Это может оказаться вопросом новичка, настолько простым, насколько это невозможно, но я все равно его оставлю. Я исходил из фона JavaScript, поэтому не уверен, что в C # (и других языках ООП) есть что-то встроенное для решения этой проблемы.

Я хочу добавить вспомогательную функциональность в мой класс, используя интерфейсы и реализацию, делегированные для разделения конкретных классов, чтобы их можно было использовать повторно.

В следующей реализации я использую "LibraryClass" из внешнего API, который я не могу изменить. Я пишу «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 более «конкретную» функциональность, такую ​​как реализация доступа и делегирования для другого класса.

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

Ключом здесь является разделение кода.

Я мог пропустить какой-то базовый урок ООП в школе, но я думаю, он никогда не опаздывает.

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Интересно, если вы ищете Композицию объектов, такую, что некоторые объекты состоят из более мелких объектов с определенной функциональностью - см. http://en.wikipedia.org/wiki/Object_composition

Тогда использование Dependency Injection делает это простым. Какие платформы .NET Dependency Injection стоит изучить?

Больше чтения

0 голосов
/ 07 июля 2011

Если вам не нужны все функции LibraryClass, вы можете просто создать упаковщик . Инкапсулируйте это в классе и выставляйте только то, что вы хотите от него.

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 # поддерживает только множественное наследование интерфейса. Классы могут наследовать только от одного конкретного класса и нескольких интерфейсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...