C#.Net中接口与继承的一个设计问题

C#.Net中接口与继承的一个设计问题,c#,oop,design-patterns,inheritance,interface,C#,Oop,Design Patterns,Inheritance,Interface,我正在经历一段非常艰难的时间来找到下面这个问题的答案,关于继承和OOP。有人能帮忙吗 问题是: 让我们假设在名为KioskFramework的程序集中有一个名为的ServiceManager的类,它实现了名为IServiceManager和IServiceProvider的两个不同接口 public interface IServiceManager { string SerialNumber { get; } string Description { get; set; }

我正在经历一段非常艰难的时间来找到下面这个问题的答案,关于继承和OOP。有人能帮忙吗

问题是:

让我们假设在名为
KioskFramework
的程序集中有一个名为
的ServiceManager
的类,它实现了名为
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)
    {
       …
    }
}
我在名为
KioskFramework.MonitoringService
的程序集中有另一个名为
的类,它使用
ServiceManager
类的某些属性(在
IServiceManager
中定义的属性)

我只想做的是,我希望能够使用
MonitoringService
中的某些属性,但没有其他类或程序集(例如
ControllingService
inside
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”程序集


提前感谢。

您可以将接口标记为
内部
,并将属性应用于程序集:

从KioskFramework.dll:

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

您可以将接口标记为
internal
,并将属性应用于程序集:

从KioskFramework.dll:

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

我不确定你的目标是什么,所以有一些一般性的建议:

  • 您可以将这些接口设置为
    内部
    ,并定义允许哪个程序集查看这些成员
    assembly:InternalsVisibleTo

  • 您可以使成员
    受保护
    ,并通过反射访问它们


我不确定你的目标是什么-所以有一些一般性的建议:

  • 您可以将这些接口设置为
    内部
    ,并定义允许哪个程序集查看这些成员
    assembly:InternalsVisibleTo

  • 您可以使成员
    受保护
    ,并通过反射访问它们


这是我的第一个想法……不过,我希望有一种方法可以直接在接口上实现这一点。因此,它们位于两个不同的程序集中,这不重要吗?是否需要强名称“KioskFramework.MonitoringService”?让我告诉你一件事。我不希望“KioskFramework.MonitoringService”可以看到“KioskFramework”的任何其他内部类和成员。那怎么办?它不必用强名称。不幸的是,所有其他内部类都必须对KioskFramework.MonitoringService可见。你不能在这里说得更具体。@Mark Cidade:你确定没有解决方法或设计模式可以做到这一点吗?我认为没有值得的。例如,您可以使内部构件对中间程序集可见,并且只从该程序集公开您想要的内容,但我认为这不是一个好主意。这是我的第一个想法……不过,我希望有一种方法可以直接在接口上实现这一点。因此,它们位于两个不同的程序集中,这不重要吗?是否需要强名称“KioskFramework.MonitoringService”?让我告诉你一件事。我不希望“KioskFramework.MonitoringService”可以看到“KioskFramework”的任何其他内部类和成员。那怎么办?它不必用强名称。不幸的是,所有其他内部类都必须对KioskFramework.MonitoringService可见。你不能在这里说得更具体。@Mark Cidade:你确定没有解决方法或设计模式可以做到这一点吗?我认为没有值得的。例如,您可以使内部构件对中间程序集可见,并且只从该程序集公开您想要的内容,但我不认为这是一个好主意。为什么投票否决了这一点?如果我不想公开所有其他内部构件呢?有人吗?为什么投票被否决了?如果我不想暴露所有其他的内部情况呢?任何人