Extension interface patterns

后端 未结 11 2019
失恋的感觉
失恋的感觉 2020-12-14 16:56

The new extensions in .Net 3.5 allow functionality to be split out from interfaces.

For instance in .Net 2.0

public interface IHaveChildren {
    str         


        
11条回答
  •  半阙折子戏
    2020-12-14 17:19

    I see a lot of people advocating using a base class to share common functionality. Be careful with this - you should favor composition over inheritance. Inheritance should only be used for polymorphism, when it makes sense from a modelling point of view. It is not a good tool for code reuse.

    As for the question: Be ware of the limitations when doing this - for example in the code shown, using an extension method to implement GetChildren effectively 'seals' this implementation and doesn't allow any IHaveChildren impl to provide its own if needed. If this is OK, then I dont mind the extension method approach that much. It is not set in stone, and can usually be easily refactored when more flexibility is needed later.

    For greater flexibility, using the strategy pattern may be preferable. Something like:

    public interface IHaveChildren 
    {
        string ParentType { get; }
        int ParentId { get; }
    }
    
    public interface IChildIterator
    {
        IEnumerable GetChildren();
    }
    
    public void DefaultChildIterator : IChildIterator
    {
        private readonly IHaveChildren _parent;
    
        public DefaultChildIterator(IHaveChildren parent)
        {
            _parent = parent; 
        }
    
        public IEnumerable GetChildren() 
        { 
            // default child iterator impl
        }
    }
    
    public class Node : IHaveChildren, IChildIterator
    { 
        // *snip*
    
        public IEnumerable GetChildren()
        {
            return new DefaultChildIterator(this).GetChildren();
        }
    }
    

提交回复
热议问题