C #: Извлечение в интерфейс класса, в котором есть другой класс - или есть лучший способ? - PullRequest
0 голосов
/ 24 марта 2011

У меня есть класс ниже, я извлек все свойства в Интерфейс, но мне кажется, что я не могу его извлечь ... Очевидно, создать новый объект, такой как

ITestItem item = new TestItem();

не дает мне доступа к Properties, которая является экземпляром класса Meta.

Я также хотел, чтобы кто-нибудь не позволил создать экземпляр класса Meta за пределами TestItem ... Я попытался пометить его как внутренний, но это позволило бы мне, потому что свойства общедоступны.

Также я не уверен, нужен ли мне интерфейс для 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>();
    }
}

EDIT Я обновил класс выше, чтобы включить внутренний конструктор для Meta, чтобы его нельзя было создать вне класса.

Вот мой интерфейс, который у меня есть (как подсказал Джидди) ... Теперь он говорит, что не реализует Свойства

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

    Meta Properties { get; set; };

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

Ответы [ 2 ]

2 голосов
/ 24 марта 2011

Так вы бы:

  1. Не хочу, возможно, использовать термин extract для интерфейса, возможно, ваше представление об интерфейсах немного ошибочно. Вы хотите немного почитать здесь.

  2. Определите класс Meta внутри класса Test. Отметьте конструктор internal или private в зависимости от того, где вы хотите создать экземпляр.

  3. Создание свойства, которое предоставляет класс Meta за пределами Test класса

    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; }
      }
    }
    

Вы также добавляете свойство Meta к своему интерфейсу:

public interface ITestItem
{
 bool Enabled { get;set;}
 Meta Properties { get;set;}
 List<int> Items { get;set;}
 void ScheduleItem();
}
1 голос
/ 24 марта 2011

Вы можете попробовать это. Его составлено в 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...