C#.Net中接口与继承的一个设计问题
我正在经历一段非常艰难的时间来找到下面这个问题的答案,关于继承和OOP。有人能帮忙吗 问题是: 让我们假设在名为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; }
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
insideKioskFramework.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:你确定没有解决方法或设计模式可以做到这一点吗?我认为没有值得的。例如,您可以使内部构件对中间程序集可见,并且只从该程序集公开您想要的内容,但我不认为这是一个好主意。为什么投票否决了这一点?如果我不想公开所有其他内部构件呢?有人吗?为什么投票被否决了?如果我不想暴露所有其他的内部情况呢?任何人