0

对于这个例子,我有 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

4 回答 4

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; }
}

然后每个子类都可以实现Datagetter

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对象。您的单元测试不依赖于任何具体的实现。

于 2013-11-15T04:01:41.137 回答
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);
}
}
于 2013-11-15T03:51:45.073 回答
0

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

F f = UserFactory.GetF();

或者:

F f;
UserFactory.Get<F>(out f);
于 2013-11-15T03:48:46.600 回答
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();
            }
        }
    }

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

于 2013-11-15T03:57:04.860 回答