限制接口子类

时间:2018-03-20 16:17:03

标签: c# inheritance interface

假设我有2个接口的子类,

public interface ITradable {
    T GetTradeManager<T>(ManagerLocation location) where T: ITradeManager
}

public interface ISpendable : ITradable {}
public interface ILoanable : ITradable {}

ITradeManager有两个子接口:ISpendManagerILoanManager

现在,当动态处理实现ITradable的对象时,我需要根据正在使用的派生类来检索适当的管理器。我设计的潜在问题似乎是我可能会尝试从ILoanManager实施中检索ISpendable。例如:

ISpendable spendable = //get
ILoanManager manager = spendable.GetTradeManager<LoanManager>(location)

现在,此特定交易可能使用不是TradeManager的{​​{1}}。但是,也可能是交易可以贷款或花费,所以我需要能够在许多情况下指定。

我认为这是糟糕的设计我错了吗?有没有更好的方法呢?我基本上希望ITradable尽可能通用,但也强制要求ISpendables只返回ISpendManagers,而ILoanables只返回ILoanManagers。

1 个答案:

答案 0 :(得分:0)

有一点是你需要为服务和经理提供一些通用的命名约定。

在您的基本服务GetTrademanager方法中,只要请求Manager,请确保它与当前服务的起始名称匹配。

    using System;
    using System.Collections.Generic;
    namespace ConsoleApplication6
    {
        class Program
        {
            static void Main(string[] args)
            {
                var child1Service = new Child1Service();
                var child2Service = new Child2Service();
                var child1Manager = child1Service.GetTradeManager<IChild1Manager>();
                var child2Manager = child2Service.GetTradeManager<IChild2Manager>();
                var child1NewManager = child1Service.GetTradeManager<IChild2Manager>();
            }
        }


        public abstract class ParentService
        {
            public T GetTradeManager<T>() where T : IBaseManager
            {
                Type instanceType = null;
                GenericHelper.DependencyDictionary.TryGetValue(typeof(T),out instanceType);
                if (instanceType == null)
                    throw new NotImplementedException("Type Not Implemented");
                if (!this.GetType().Name.Replace("Service", "").StartsWith(instanceType.Name.Replace("Manager", "")))
                    throw new InvalidOperationException("Not Same Manager");
                return (T)Activator.CreateInstance(instanceType);
            }

        }
        public class Child1Service : ParentService { }
        public class Child2Service : ParentService { }

        public abstract class BaseManager : IBaseManager
        {

        }
        public interface IBaseManager
        {

        }

        public interface IChild1Manager : IBaseManager { }
        public class Child1Manager : BaseManager, IChild1Manager { }


        public interface IChild2Manager : IBaseManager { }
        public class Child2Manager : BaseManager, IChild2Manager { }


        public static class GenericHelper
        {
            public static Dictionary<Type, Type> DependencyDictionary { get; set; } = new Dictionary<Type, Type>() { { typeof(IChild1Manager), typeof(Child1Manager) }, { typeof(IChild2Manager), typeof(Child2Manager) } };
        }

    }

当你试图获得另一种类型的经理时,它会抛出一个错误。