面向对象编程

时间:2010-09-07 09:33:52

标签: c#

我是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函数,该函数在Persons类中使用此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

有人可以帮忙吗?

提前致谢

5 个答案:

答案 0 :(得分:2)

  1. base.InputPerson;根本无法使用。

  2. 您无法用void InputPerson(Persons P)覆盖void InputPerson(User U),因为您似乎暗示了这一点。签名必须相同。

答案 1 :(得分:1)

这只是我对这个问题的更多切向看法,但根据传统的OO设计指南,用户人,因此你获得了继承权。但是,当我们查看 SOLID 原则,特别是“Liskov替换原则”时:

  

“使用指针或对基类的引用的函数必须能够使用派生类的对象而不知道它。” - 罗伯特·马丁,来自“OOD原则”的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并查看单一责任原则,并询问Person / User对象是否处理成为一个人的逻辑,但它应该知道从控制台创建该对象吗?如果要为Windows应用程序或WPF应用程序重用相同的逻辑,会发生什么?

答案 2 :(得分:0)

要覆盖一个方法,你必须保留它的签名,你没有(你将参数的类型从Persons更改为User,所以你创建一个新方法)。因此,请删除'override'关键字。

另外,使用:

InputPerson(U);

而不是:

base.InputPerson;

答案 3 :(得分:0)

您还可以利用类继承来执行以下操作:

public override void InputPerson(Persons P)
{
   // Code in here
}

由于用户是人,因此您可以直接将其作为参数传递给Method。如果有的话 用户的自定义属性,您可以引入泛型的人不存在。

public class Persons<T>
{
   public virtual void InputPerson(T p)
   {
 // code here.
   }
}

public class User : Person<User>
{
 public override void InputPerson(User p)
 {
  // code here. You can now treat the input as a user
  // as you have told your base class that the 'T' is a user.
 }
}

答案 4 :(得分:-1)

不使用覆盖方法,而是使用new关键字,因为签名不同。

public new void InputPerson(User U)

然后您需要做的就是将User U传递给基类,而不是

base.InputPerson;

使用

base.InputPerson(U);