重载方法可以使用不同的类型而无需转换为c#吗?

时间:2013-11-15 03:45:06

标签: c#

这个例子我有3个简单的类:

 public class User
{
    public string FirstName { get; set; }
}

public class E : User
{
    public string MiddleInitial { get; set; }
}
public class F : User
{
    public string LastName { get; set; }
}

我有一些简单的Print方法,我会重载以采用特定类型。不要介意回复写,它只是为了显示使用该类型不属于基础的属性的目标。

public void Print(E e)
{
    Response.Write(e.FirstName);
}

public void Print(F f)
{
    Response.Write(f.LastName);
}

我很好奇如何在不必投射类型的情况下让这些说明工作?总共,我有4个独立的User s。每个都经历相同的过程。我喜欢一次使用代码,而不是4次。以下代码无法编译,因为LastName对象上没有User

User u = UserFactory.Get("f");
Print(u);

4 个答案:

答案 0 :(得分:3)

将打印逻辑与实体本身分开(分离关注点)会很好。我会创建一个IPrintable接口:

public interface IPrintable
{
    string Data { get; }
}

...然后在User课程上实施该课程(如果可以,请将其设为abstract

public abstract class User : IPrintable
{
    public string FirstName { get; set; }
    public abstract string Data { get; }
}

然后,每个子类都可以实现Data getter

public class E : User
{
    public string MiddleInitial { get; set; }
    public override string Data { get { return MiddleInitial; } }
}

public class F : User
{
    public string LastName { get; set; }
    public override string Data { get { return LastName; } }
}

...无论您使用什么打印,都可以接受IPrintable对象

public void Print(IPrintable entity)
{
    Response.Write(entity.Data);
}

这有许多优点。首先,如果您想打印任何其他类型的对象(User对象除外),您可以使用该对象实现IPrintable。您的Print方法无需更改任何内容。

另一个优点是您的Print方法现在可以轻松进行单元测试。您可以在测试时简单地传入模拟IPrintable对象。您的单元测试不依赖于任何具体实现。

答案 1 :(得分:2)

我认为你应该这样实现。

void Main()
{
User u = UserFactory.Get("f");
u.Print();
}


public class User
{
public string FirstName { get; set; }

public virtual void Print()
{
    Response.Write(this.FirstName);
}
}

public class E : User
{
public string MiddleInitial { get; set; }

public override void Print()
{
    Response.Write(this.FirstName);
}
}
public class F : User
{
public string LastName { get; set; }

public override void Print()
{
    Response.Write(this.LastName);
}
}

答案 2 :(得分:0)

我会让UserFactory返回正确的类型:

F f = UserFactory.GetF();

或:

F f;
UserFactory.Get<F>(out f);

答案 3 :(得分:0)

你在寻找这样的东西:

public class User
    {
        public string FirstName { get; set; }

        virtual public void Print()
        {
            Console.WriteLine(FirstName);
        }
    }

    public class E : User
    {
        public string MiddleInitial { get; set; }

        override public void Print()
        {
            Console.WriteLine(MiddleInitial);
        }
    }
    public class F : User
    {
        public string LastName { get; set; }

        override public void Print()
        {
            Console.WriteLine(LastName);
        }
    }

    internal class Program
    {
        public static void Main(string[] args)
        {
            var userArray = new User[3];

            userArray[0] = new User { FirstName = "John" };
            userArray[1] = new F { LastName = "Doe" };
            userArray[2] = new E { MiddleInitial = "K" };

            PrintUsers(userArray);
        }

        private static void PrintUsers(User[] userArray)
        {
            foreach (var user in userArray)
            {
                user.Print();
            }
        }
    }

这使用方法覆盖,以便每个调用自动选择适当的方法。