我是C#的新手。我有一个带有此函数的Persons类:
public virtual void InputPerson(Persons P)
{
P.ID = int.Parse(Console.ReadLine());
Console.WriteLine("Titel:");
P.Titel = Console.ReadLine();
Console.WriteLine("Name:");
P.Name = Console.ReadLine();
Console.WriteLine("Surname:");
P.Surname = Console.ReadLine();
}我有一个继承自Persons类的User类。现在,我需要在User类中创建一个InputUser函数,该函数在Person类中使用此InputPerson函数,而不需要重写从InputPerson函数到InputUser函数的所有代码。下面是我的InputUser函数代码:
public override void InputPerson(User U)
{
Console.WriteLine("Please enter a Customer:");
Console.WriteLine("Customer ID:");
base.InputPerson;
Console.WriteLine("Telephone Number:");
U.Telephone = int.Parse(Console.ReadLine());
Console.WriteLine();
}这段InputUser代码给我一个错误,说明:
'UserCustomerNotes.User.InputPerson(UserCustomerNotes.User)': no suitable method found to override有人能帮帮忙吗?
提前感谢
发布于 2010-09-07 17:44:33
由于签名不同,请改用new关键字而不是重写该方法。
public new void InputPerson(User U)然后,您所需要做的就是将User U传递给基类,而不是
base.InputPerson;使用
base.InputPerson(U);发布于 2010-09-07 17:38:48
base.InputPerson;根本不能工作。void InputPerson(Persons P)覆盖void InputPerson(User U)。签名必须相同。发布于 2010-09-07 18:27:44
这只是我对这个问题更切题的看法,但在面向对象设计的传统指导方针下,用户就是一个人,因此你得到了继承。然而,当我们研究原则,特别是“利斯科夫替代原则”时:
“使用指向基类的指针或引用的函数必须能够在不知情的情况下使用派生类的对象。”- Robert Martin,链接到面向对象设计原则的LSP论文
那是什么意思?那么,我们应该能够用一个子类的实例替换它的父类,一切都应该继续工作。在这种情况下,它不会工作,有一些额外的属性,您依赖于用户,而一个人没有这些属性。
在这种情况下,你有没有考虑过做组合而不是继承?
public class Person
{
public static void InputPerson(Person p)
{
// Do the input logic here
}
}
public class User
{
public Person Person { get; private set; }
public static void InputUser(User u)
{
if (u.Person == null)
u.Person = new Person;
Person.InputPerson(u.Person);
Console.WriteLine("Telephone:");
u.Telephone = Console.ReadLine();
}
}我们可以进一步深入到SOLID,看看Single Responsibility原则,然后问Person/User对象是否处理作为person的逻辑,但它是否应该知道从控制台创建该对象?如果要对windows应用程序或WPF应用程序重用相同的逻辑,会发生什么情况?
https://stackoverflow.com/questions/3657455
复制相似问题