C#解析基类以纠正基于实现类型的存储库方法调用

时间:2017-07-26 15:46:53

标签: c# oop design-patterns overloading

在我们当前的项目中,我们有一个抽象的基本用户类,由多个其他用户类型实现。我们有一个比较类,可以比较任何这些类型,然后需要根据实现的类型调用正确的更新API。我试图避免将if(typeof(用户))逻辑树引入代码,并希望找到一些方法来解决方法重载的问题。是否有任何设计模式可以帮助解决此问题与某种类型的接口可以依赖注入?这是一个基本的代码示例

using System;
using System.Collections.Generic;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            List<BaseUser> TestUsers = new List<BaseUser>();
            TestUsers.Add(new UserA() { Email = "test1@test.com", Location = "New York, NY" });
            TestUsers.Add(new UserB() { Email = "test2@test.com", State = "TN" });

            foreach (var user in TestUsers)
            {
                //need to invoke the correct Print repo method based on the actual user type, possible interface?

            }

            Console.Read();
        }
    }

    public abstract class BaseUser
    {
        public string Email { get; set; }
    }

    public class UserA : BaseUser
    {
        public string Location { get; set; }
    }
    public class UserB : BaseUser
    {
        public string State { get; set; }
    }

    public class UserARepo
    {
        void Print(UserA user)
        {
            Console.Write($"User A Saved {user.Email}, {user.Location}");
        }
    }
    public class UserBRepo
    {
        void Print(UserB user)
        {
            Console.Write($"User B Saved {user.Email}, {user.State}");
        }
    }

}

2 个答案:

答案 0 :(得分:0)

如果Print方法只需要对象的Email和Location / State属性,则更改其签名以仅接受这两个字符串。

我会向抽象类添加一个公共属性,该类返回User *类中所需的属性:

namespace ConsoleApplication5
{
    public abstract class BaseUser
    {
        public string Email { get; set; }
        public string OtherLocation { get; set;}
    }

    public class UserA : BaseUser
    {
        public string Location { get; set; }
        public string OtherLocation {
          get
          {
            return this.Location;
          }
          set
          {
            this.Location = value;
          }
        }
    }
    public class UserB : BaseUser
    {
        public string State { get; set; }
        public string OtherLocation {
          get
          {
            return this.State;
          }
          set
          {
            this.State = value;
          }
        }
    }

    public class UserARepo
    {
        void Print(BaseUser user)
        {
            Console.Write($"User A Saved {user.Email}, {user.OtherLocation}");
        }
    }
    public class UserBRepo
    {
        void Print(BaseUser user)
        {
            Console.Write($"User B Saved {user.Email}, {user.OtherLocation}");
        }
    }
}

答案 1 :(得分:0)

希望我能正确理解问题 - 但如果每个UserType都需要更新API或Print Repo方法,请将它们作为抽象方法放在类中:

public abstract class BaseUser
{
    public string Email { get; set; }
    public abstract void PrintRepo();
}

基本上,这只是一个问题:如果要实现基类,子类需要什么功能?他们必须处理更新请求?然后在抽象类中添加一个抽象声明,声明:“嘿,如果你继承我,你必须包含一个Update函数。”

然后你的主要功能就像:

foreach (var user in TestUsers)
{
    user.PrintRepo();
}