将类强制转换为它实现的接口是多么好,但在创建它的那一刻却没有

时间:2018-01-03 15:46:46

标签: c# oop generics design-patterns casting

有一个代码,其中有这个实现:

using System;
using System.Collections.Generic;

namespace ConsoleApp{

    public interface IModel { } 

    public class Model : IModel { }

    public interface IDataBuilder<T> where T : IModel
    {
        T Build();
    }

    public interface IActionBuilder<T> where T : IModel
    {
        object BuildAction(T model);
    }

    public interface ISet<T> where T : IModel
    {
        IDataBuilder<T> DataBuilder { get; } 
        IActionBuilder<T> ActionBuilder { get;}
    }

    public class Builder
    {
        private List<ISet<IModel>> _dataBuilders;
        public void AddSet(ISet<IModel> _dataBuilder)
        {
            _dataBuilders.Add(_dataBuilder);
        }
    }

    public class MySet : ISet<Model>
    {
        public IDataBuilder<Model> DataBuilder => throw;    
        public IActionBuilder<Model> ActionBuilder  => throw;
    } 

    public class Program 
    {
        static void Main(string[] args)
        {
            var builder = new Builder(); 
            builder.AddSet( new MySet() );
        }      
    }   
} 

并在行

builder.AddSet( new MySet() );

我收到此错误:

  

Program.cs(56,29):[CS1503]参数1:无法转换   'ConsoleApp.MySet''ConsoleApp.ISet<ConsoleApp.IModel>'

当然,我可以直接演员:

var builder = new Builder(); 
builder.AddSet( (ISet<IModel>)new MySet() );

但在我的情况下,这不是一个选项,我需要它在没有这样的演员的情况下在架构上进行解决。

不幸的是,使用协方差和不变性并没有帮助。

0 个答案:

没有答案