首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向对象编程

面向对象编程
EN

Stack Overflow用户
提问于 2010-09-07 17:33:52
回答 5查看 208关注 0票数 1

我是C#的新手。我有一个带有此函数的Persons类:

代码语言:javascript
复制
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函数代码:

代码语言:javascript
复制
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代码给我一个错误,说明:

代码语言:javascript
复制
'UserCustomerNotes.User.InputPerson(UserCustomerNotes.User)': no suitable method found to override

有人能帮帮忙吗?

提前感谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-09-07 17:44:33

由于签名不同,请改用new关键字而不是重写该方法。

代码语言:javascript
复制
public new void InputPerson(User U)

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

代码语言:javascript
复制
base.InputPerson;

使用

代码语言:javascript
复制
base.InputPerson(U);
票数 -1
EN

Stack Overflow用户

发布于 2010-09-07 17:38:48

  1. base.InputPerson;根本不能工作。
  2. 你不能像你所暗示的那样用void InputPerson(Persons P)覆盖void InputPerson(User U)。签名必须相同。
票数 2
EN

Stack Overflow用户

发布于 2010-09-07 18:27:44

这只是我对这个问题更切题的看法,但在面向对象设计的传统指导方针下,用户就是一个人,因此你得到了继承。然而,当我们研究原则,特别是“利斯科夫替代原则”时:

“使用指向基类的指针或引用的函数必须能够在不知情的情况下使用派生类的对象。”- Robert Martin,链接到面向对象设计原则的LSP论文

那是什么意思?那么,我们应该能够用一个子类的实例替换它的父类,一切都应该继续工作。在这种情况下,它不会工作,有一些额外的属性,您依赖于用户,而一个人没有这些属性。

在这种情况下,你有没有考虑过做组合而不是继承?

代码语言:javascript
复制
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应用程序重用相同的逻辑,会发生什么情况?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3657455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档