2012-06-29 3 views
0

У меня есть мелкий вопрос.Вложения классов с интерфейсами

Когда я начал программировать свое приложение, я сгруппировал типы одного уровня с классом FirstLevel (все типы этого уровня получены из FirstLevel). После этого я начал создавать общие списки с этим типом, и мой код работает с ним без каких-либо ошибок.

Теперь, через некоторое время, мне нужно использовать функцию Generate в каждом классе, которая получена из FirstLevel или родительский элемент получен из FirstLevel. Я думал, что интерфейс может быть хорошим решением, поэтому я начал реализовывать интерфейс IGenerable для каждого класса, который имеет что-то общее с классом FirstLeve l (его производным или родителем является родителем родителя). внедрил его также в класс FirstLevel.

И вот начало моей проблемы. Мне нужно вызвать функцию генерации для каждого элемента, который находится в List<FirstLevel>. Но я не знаю, будет ли называться реализация IGenerable в FirstLevel или реализациями IGenerable в производных классах. Надеюсь, что компьютер выполнит вызов реализаций в производных классах. Пожалуйста, скажите мне, как это.

Но, если там будет называться реализация FirstLevel, пожалуйста, помогите мне с ней и предложите некоторые решения. Благодарю.

+2

Это было бы легче понять с помощью образца кода. Не могли бы вы включить его? – l15a

+0

Вы хотите запустить код из родителя или из специализированного класса? –

ответ

2

Вместо использования интерфейса вам может быть лучше, добавив виртуальную функцию «Сгенерировать» в ваш базовый класс (FirstLevel), а затем переопределить метод в потомках по мере необходимости. Теперь, когда вы перебираете List и вызываете Generate, если объект имеет переопределенный метод, он выполнит это, иначе он выполнит метод из базового объекта.

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var objs = new List<FirstLevel> { new FirstLevel(), new SecondLevel(), new ThirdLevel(), new SecondLevel2() }; 
      objs.ForEach(o => o.Generate()); 
      Console.ReadLine(); 
     } 

    } 

    public class FirstLevel 
    { 
     public virtual void Generate() 
     { 
      Console.WriteLine("First Level Generate called."); 
     } 
    } 

    public class SecondLevel : FirstLevel 
    { 
     public override void Generate() 
     { 
      Console.WriteLine("Second Level generate called."); 
     } 
    } 

    public class SecondLevel2 : FirstLevel 
    { 

    } 
    public class ThirdLevel : SecondLevel 
    { 
     public override void Generate() 
     { 
      Console.WriteLine("Third Level genrate."); 
     } 
    } 
} 
Смежные вопросы