这个例子我有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);
答案 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();
}
}
}
这使用方法覆盖,以便每个调用自动选择适当的方法。