Проблема проектирования об интерфейсах и наследовании в C # .Net - PullRequest
0 голосов
/ 01 сентября 2011

Мне очень трудно найти ответ на вопрос ниже, о наследовании и ООП.Может ли кто-нибудь помочь, пожалуйста?

Вот вопрос:

Давайте предположим, что у меня есть класс с именем ServiceManager внутри сборки с именем KioskFramework, который реализует 2 различных интерфейса с именами IServiceManager и IServiceProvider.

public interface IServiceManager
{
    string SerialNumber { get; }
    string Description { get; set; }

    int DoFoo(IServiceManager instance, int a, int b);
}

public interface IServiceProvider
{
    void DoSomethingRESTRICTED();
}

class ServiceManager : IServiceManager, IServiceProvider
{
    public void DoSomethingRESTRICTED();

    …  // some other properties and methods...

    public string SerialNumber { get { … } }

    public string Description { get { … } set { … } }

    public int DoFoo(int a, int b)
    {
       …
    }
}

У меня есть другой класс с именем MonitoringService внутри сборки с именем KioskFramework.MonitoringService, который использует определенные свойства класса ServiceManager (те, которые определены в IServiceManager).

class MonitoringService
{
    …  // some other properties and methods...

    public int DoBar(IServiceManager instance, int a, int b)
    {
       // an example to show that I need access to ServiceManager's properties
       return instance.SerialNumber.Length + 
              instance.Description.Length + 
              instance.DooFoo(a, b);
    }
}

Все, что я хочу сделать, - это чтобы я мог использовать определенные свойства в MonitoringService, но не в другом классе или сборке (например, ControllingService внутри * 1031).*), может получить доступ к этим свойствам.

class ControllingService
{
    public void DoSomethingElse(IServiceProvider instance)
    {
        // this method should not have access to the IServiceManager's 
        // properties and methods, even if it has an instance of
        // IServiceProvider, or even if it has referenced the assembly 
        // containing IServiceManager interface
    }
}

Возможно ли это?Как?Есть ли шаблон для решения этой проблемы?

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

edit: После ответа Марка Сайдада я отредактировал это сообщение, сказав, что не хочу показывать другие внутренние элементы и классы сборки "KioskFramework" сборке "KioskFramework.MonitoringService".

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 01 сентября 2011

Вы можете пометить интерфейс как internal и применить к сборке атрибут InternalsVisibleTo:

Из KioskFramework.dll:

[assembly:InternalsVisibleTo("KioskFramework.MonitoringService")]
0 голосов
/ 01 сентября 2011

Я не уверен, какова ваша цель - поэтому некоторые общие указатели:

  • вы можете сделать эти интерфейсы internal и определить, какая сборка может видеть эти элементы assembly: InternalsVisibleTo

  • вы можете сделать членов protected и получить к ним доступ через Reflection

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