C#:向一个接口提取一个内部有另一个类的类 - 或者有更好的方法吗?

时间:2011-03-24 09:56:04

标签: c# oop interface

我有一个下面的类,我已经将所有属性提取到接口但我似乎无法提取它...显然创建一个新的对象,如

ITestItem item = new TestItem();

不允许我访问作为Meta类实例的Properties。

我还想阻止任何人在TestItem之外创建一个Meta类的实例...我尝试将其标记为内部但是这样可以允许我,因为属性是公开的。

我也不确定我是否需要META接口?

这是我的班级......任何人都可以帮忙吗?

public class TestItem : ITestItem
{
    public bool Enabled { get; set; }

    public Meta Properties = new Meta();

    public List<int> Items { get; set; }

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

    public TestItem()
    {
        this.Items = new List<int>();
    }
}

修改 我已经使用了上面的类来包含Meta的内部构造函数,因此它不能在类外实例化。

这是我的界面(正如giddy所建议的那样)......现在说它没有实现属性

public interface ITestItem
{
    bool Enabled { get; set; }

    Meta Properties { get; set; };

    List<int> Items { get; set; }
}

2 个答案:

答案 0 :(得分:2)

所以你会:

  1. 不想使用术语 extract 进行交互,也许你对接口的想法有点不对。你想在这里做一些阅读。

  2. 在Test类中定义Meta类。根据您要创建实例的位置标记构造函数internalprivate

  3. 创建一个在Test

    之外公开Meta类的属性
    public class TestItem : ITestItem
    {
      public TestItem() 
      { 
         this.Properties = new Meta();//set it from here
         this.Items = new List<int>();
      }
    
      public bool Enabled { get; set; }
    
      //make it private set if you don't want an outsider setting it
      public Meta Properties {get;private set}
    
      public List<int> Items { get; set; }
    
    
      public class Meta
      {//make it private if you only create an instance here.
         internal Meta(){}
         public string Name { get; set; }
      }
    }
    
  4. 您还可以在界面中添加Meta属性:

    public interface ITestItem
    {
     bool Enabled { get;set;}
     Meta Properties { get;set;}
     List<int> Items { get;set;}
     void ScheduleItem();
    }
    

答案 1 :(得分:1)

你可以试试这个。它编译在VS2010中。无论如何,为了“解耦类”以允许单元测试,也可以为Meta提取接口。请搜索并阅读 - “解耦课程”。

public class Meta { // Do not make this class a child class for flexibility and testing purposes.
    public string Name { get; set; }
}

public class IMeta { 
    string Name { get; set; }
}

public class TestItem : ITestItem {
    public TestItem() {
        this.Meta = new Meta();
        this.Items = new List<int>();

    public bool Enabled { get; set; }
    public IMeta Meta { get; internal set; }
    public List<int> Items { get; set; }
}

public interface ITestItem {
    bool Enabled { get; set; }        
    IMeta Meta { get;}
    IList<int> Items { get; set; }
}