在接口级别强制执行getter setter访问

时间:2016-04-24 15:51:00

标签: c# design-patterns interface

我希望在接口级别对getter或setter强制访问属性,以便在实现它的类中遵循相同的访问权限。我想做类似下面的事情:

eclipse

但不幸的是,据我所知,C#中不允许这样做。我认为这是因为界面只是为了揭示公共访问的内容(我没有最轻微的想法!)。

我需要的是使用任何其他编码模式(最好使用接口)实现此功能的方法,这将有助于我对其所有已实现的类中的属性的getter或setter强制执行特定访问。

我用Google搜索并试图通过MSDN文档,但没有运气!

3 个答案:

答案 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,例如: SpecificExampleAnotherSpecificExample

答案 2 :(得分:0)

这是不可能的。正如大家告诉你的那样,接口意味着定义公共访问。以下代码怎么样?

public interface IExample
{
    string Name
    {
        get;
    }
}