2015-10-13 2 views
1

У меня есть следующий сценарий, когда я извлекаю набор объектов типа BaseObject. Я разбил их по типам Object1 и Object2.Наследование общего объекта

Теперь у меня есть два класса (Plugin1 и Plugin2), которые обрабатывают этот список в соответствии с конкретным типом типа i.e типа Object1 или типа Object2.

Как вы можете видеть в коде, мне нужно было объявить разные списки в соответствующих классах.

В базовом классе установлен способ замедления? Мне все же нужно иметь возможность обрабатывать списки в соответствии с их типом в их соответствующих классах, то есть плагине1 и плагине2.

public class BaseObject {} 
public class Object1 : BaseObject {} 
public class Object2 : BaseObject {} 

public interface IPlugin 
{ 
    void Process(); 
} 

public class BasePlugin : IPlugin 
{ 
    protected MyManager _manager;   

    public BasePlugin(MyManager manager) 
    { 
     this._manager = manager;    
    } 

    public virtual void Process() { } 
} 

public class Plugin1 : BasePlugin 
{ 
    private List<Object1> _list; 

    public Plugin1(MyManager manager, List<Object1> list) 
     : base(manager) 
    { 
     _list = list; 
    } 

    public override void Process() 
    { 
     base.Process(); 
    } 
} 

public class Plugin2 : BasePlugin 
{ 
    private List<Object2> _list; 

    public Plugin2(MyManager manager, List<Object2> list) 
     : base(manager) 
    { 
     _list = list; 
    } 

    public override void Process() 
    { 
     base.Process(); 
    } 
} 
+1

Может ли ваш список не иметь тип «BaseObject» - если нет, то наследование BaseObject может оказаться неприемлемым. – Paddy

+0

Нет списка не может быть типа BaseObejct. – JEPAAB

ответ

2

Вы должны быть в состоянии сделать интерфейс IPlugin родовое, т.е.

public interface IPlugin<T> where T: BaseObject 
{ 
    void Process(); 
} 

public class BasePlugin<T> : IPlugin<T> 
{ 
    protected MyManager _manager;   
    protected List<T> _list; 

    public BasePlugin(MyManager manager, List<T> list) 
    { 
     this._manager = manager;  
     _list = list;   
    } 

    public virtual void Process() {... } 
} 

Теперь, если код Plugin1 и Plugin2 то же самое, и отличается только типом, они просто становятся:

var plugin1 = new BasePlugin<Object1>(); 
var plugin2 = new BasePlugin<Object2>(); 

т. Е. Вам вообще не нужны классы, вы можете просто указать тип при объявлении.

+1

Да, вот что я сейчас придумал. Благодарю. Однако я думаю, что мне все еще нужны классы, потому что мне нужно обрабатывать списки по-разному. – JEPAAB

0

Дженерики, похоже, выполнили эту работу.

https://msdn.microsoft.com/en-us/library/512aeb7t.aspx

public abstract class BaseObject {} 
public class Object1 : BaseObject {} 
public class Object2 : BaseObject {} 

public interface IPlugin 
{ 
    void Process(); 
} 

public class BasePlugin<T> : IPlugin where T : BaseObject 
{ 
    protected MyManager _manager;   

    protected List<T> _list; 

    public BasePlugin(MyManager manager, List<T> list) 
    { 
     this._manager = manager;    
     this._list = list; 
    } 

    public virtual void Process() { } 
} 

public class Plugin1 : BasePlugin<Object1> 
{  
    public Plugin1(MyManager manager, List<Object1> list) 
     : base(manager, list) { } 

    public override void Process() 
    { 
     base.Process(); 
    } 
} 

public class Plugin2 : BasePlugin<Object2> 
{ 
    public Plugin2(MyManager manager, List<Object2> list) 
     : base(manager, list) { } 

    public override void Process() 
    { 
     base.Process(); 
    } 
} 
Смежные вопросы