内部和外部接口和集合

时间:2009-04-06 08:16:46

标签: c# inheritance interface

实施以下内容的最佳方式是什么?

我有一组实现接口的对象,在内部我希望能够公开set并获取属性并从外部获取。

以下是我想要的一个例子...... 那不编译。

public interface ITable
{
   string Name { get; }
}

internal interface IInternalTable 
{
   string Name { get; set; }
}

internal class Table : ITable, IInternalTable
{
   public string Name { get; set; }
   public string ITable.Name { get { return Name; } }
}

public class Database
{
    private List<IInternalTable> tables;

    public List<ITable>
    {
       get { return this.tables; }
    }
}

5 个答案:

答案 0 :(得分:3)

使用此:

public interface ITable
{
    string Name { get; }
}

public class Table : ITable
{
    public string Name { get; internal set; }
}

public class Database
{
    public List<ITable> Tables { get; private set; }
}

注意:获取或设置访问者使用的辅助功能修饰符只能限制可见性而不会增加它。

答案 1 :(得分:1)

如果Table隐式实现IInternalTable,并且IInternalTable是内部的,那么这些方法只能在内部访问(因为只有内部代码才能使用IInternalTable:

public interface ITable
{
   string Name { get; }
}

internal interface IInternalTable 
{
   string Name { get; set; }
}

public class Table : ITable, IInternalTable
{
   public string Name { get; set; }
   string ITable.Name { get { return Name; } }
}

public class Database
{
    private List<Table> tables;

    public List<Table> Tables
    {
       get { return this.tables; }
    }
}

(现在还公开了Table类型,以避免协方差不足的问题......也可以通过Database.Tables返回副本并具有不同的内部属性来解决。)

答案 2 :(得分:0)

它不会编译,因为IInternalTable和ITable之间没有转换。解决方案就像Koistya Navin建议的那样:

public class Table {
    public string Name {get; internal set; }
}

public class Database {
    public IList<Table> Tables { get; private set;}

    public Database(){
        this.Tables = new List<Table>();
    }
}

答案 3 :(得分:0)

这是代表您的域模型的类中常见的需求,您希望对象具有ID的公开公开的只读属性,该属性必须在内部设置。我过去使用的解决方案是使用方法作为setter:

public interface ITable
{
    string Name { get; }
}

internal interface ITableInternal
{
   void SetName(string value);
}

public class Table : ITable, ITableInternal
{
    public string Name { get; }

    public void SetName(string value)
    {
       // Input validation

       this.Name = value;
    }
}

public class Database
{
    public Table CreateTable()
    {
        Table instance = new Table();
        ((ITableInternal)instance).SetName("tableName");

        return table;
    }    
}

答案 4 :(得分:0)

实际上,我建议将setter-interface完全隐藏为私有接口:

public interface ITable
{
   string Name { get; }
}

public class Database
{

    private interface IInternalTable 
    {
       string Name { get; set; }
    }

    private class Table : ITable, IInternalTable
    {
        public string Name { get; set; }
        string ITable.Name { get { return Name; } }
    }

    private List<IInternalTable> tables;

    public List<ITable> Tables
    {
       get { return this.tables; }
    }
}

这样,Database以外的任何人都无法修改Database.Tables中的项目。