关于C#.Net中接口和继承的设计问题

时间:2011-09-01 16:46:33

标签: c# oop design-patterns inheritance interface

我很难找到下面问题的答案,关于继承和OOP。有人可以帮忙吗?

以下是问题:

假设我在名为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类中定义的属性{1}})。

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内的KioskFramework.ControllingService),可以访问该属性。

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
    }
}

有可能吗?怎么样?有解决方案的设计模式吗?

也许我以错误的方式或方式思考,但我的目标是限制某个类的某些成员只能在某些程序集中看到/使用而不是全部。

编辑:在Mark Cidade回答之后,我编辑了这篇文章,说我不想将其他内部成员和“KioskFramework”程序集类暴露给“KioskFramework.MonitoringService”程序集。

提前致谢。

2 个答案:

答案 0 :(得分:4)

您可以将界面标记为internal并将InternalsVisibleTo属性应用于程序集:

来自KioskFramework.dll:

[assembly:InternalsVisibleTo("KioskFramework.MonitoringService")]

答案 1 :(得分:0)

我不确定你的目标是什么 - 所以一些一般指示:

  • 您可以创建这些接口internal并定义允许哪个程序集查看这些成员assembly: InternalsVisibleTo

  • 您可以制作成员protected并通过反映

  • 访问它们