我希望在接口级别对getter或setter强制访问属性,以便在实现它的类中遵循相同的访问权限。我想做类似下面的事情:
eclipse
但不幸的是,据我所知,C#中不允许这样做。我认为这是因为界面只是为了揭示公共访问的内容(我没有最轻微的想法!)。
我需要的是使用任何其他编码模式(最好使用接口)实现此功能的方法,这将有助于我对其所有已实现的类中的属性的getter或setter强制执行特定访问。
我用Google搜索并试图通过MSDN文档,但没有运气!
答案 0 :(得分:1)
在setter上使用internal
无论如何都有点讨厌,但是如果你真的想要这样做,你可以定义第二个接口,它本身就是内部的,并为你的程序集制作Example
internal
。
public interface IExample
{
string Name
{
get;
}
}
internal interface IExampleInternal
{
string Name
{
set; get;
}
}
internal class Example : IExample, IExampleInternal
{
public string Name { get; set; } = string.Empty;
}
现在同一个程序集中的任何内容都可以使用IExampleInternal
,而外部只能查看IExample
。但是,您必须在您创建的每个类上列出两个接口。
答案 1 :(得分:1)
这个怎么样?这可以是一种解决方法:
// Assembly: A
public interface IExample
{
string Name { get; }
}
// Assembly: B
using A;
public abstract class Example : IExample
{
public string Name { get; protected internal set; }
}
public class SpecificExample : Example
{
public void UpdateName(string name)
{
// Can be set because it has protected accessor
Name = name;
}
}
class Program
{
static void Main(string[] args)
{
IExample e = new SpecificExample()
{
// Can be set because it has internal accessor
Name = "OutsideAssemblyA"
};
}
}
// Assembly: C
using A;
public abstract class Example : IExample
{
public string Name { get; protected internal set; }
}
public class AnotherSpecificExample : Example
{
public void UpdateName(string name)
{
// Can be set because it has protected accessor
Name = name;
}
}
class Program
{
static void Main(string[] args)
{
IExample e = new AnotherSpecificExample()
{
// Can be set because it has internal accessor
Name = "OutsideAssemblyA"
};
}
}
这样可行,但您必须在每个要在其中创建特定实现的程序集中创建(或复制粘贴)abstract class Example
,例如: SpecificExample
或AnotherSpecificExample
。
答案 2 :(得分:0)
这是不可能的。正如大家告诉你的那样,接口意味着定义公共访问。以下代码怎么样?
public interface IExample
{
string Name
{
get;
}
}