【问题标题】:How to create a class inheriting from a sealed and a public class at the same time如何同时创建从密封类和公共类继承的类
【发布时间】:2020-06-26 16:37:40
【问题描述】:

我有一个密封的和公共的类对象在项目的许多类中使用。

public sealed class Customer {

public int Id{get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public string MiddleName {get; set;}
public string Address {get; set;}

}

public class PageRequest
{
     public int CurrentPage {get; set;}
     public int PerPage {get; set;}
     public string SortBy {get; set;}
}

我需要创建一个新的类对象,其中包含两个类中的所有属性 而不是重复所有的属性。以下可以将 pagerequest 属性引入新类,但我怎样才能设法获取 Customer 类的属性。我不能继承 Customer 的属性,因为它是一个密封类。从 Customer 中删除 seal 可能不是一个好主意,因为它已被许多应用程序领域使用,即使这样我也不能同时将 Customer 和 PageRequest 作为基类。如果有更好的方法,我可以更改现有的 Customer 类

public class NewClass : PageRequest
{

}

像下面这样重复 NewClass 中的属性是否更好?

public class NewClass : PageRequest
    {
        public int Id{get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public string MiddleName {get; set;}
    public string Address {get; set;}
    }

这个新的类对象将用作新 api 获取请求查询字符串的一部分,其中用户必须提供一个或多个(名字、姓氏、地址)和 currentpage、perpage、sortby 作为输入参数,需要更好的方法使所有参数与请求相匹配。我想使用这个类作为获取请求 (http://someendpoint&firstname=a&lastname=b&currentpage=1&perpage=10)

public Task<PaginatedResult<SomeDto>> GetResult([FromQuery]NewClass request) 
{

}

【问题讨论】:

  • C#只能有一个基类,所以其他的parenet需要是接口。
  • 我认为正确的方法是使用 Custom 作为 NewClass 的字段
  • 您是否打算将这个NewClass 的值替换为期望CustomerPageRequest 值的现有代码?如果没有,你不应该使用继承;相反,您应该创建一个带有 Customer 属性和 Page Request 属性的 NewClass。 (这被称为“优先组合而不是继承”,如果你想研究更多。)
  • 是的,我希望它被替换为现有代码
  • “继承自密封”

标签: c# class inheritance multiple-inheritance sealed-class


【解决方案1】:

C#中没有多重继承,一个类是密封的……

你可以像这样使用composition

public class NewClass : PageRequest
{
  public Customer Customer { get; private set; }
  public NewClass()
  {
    Customer = new Customer();
  }
}

所以Customer 实例是在NewClass 实例创建时创建的,并且会一直存在直到其销毁。

您也可以根据需要添加一些包装方法,并将Customer 标记为私有,例如:

public class NewClass : PageRequest
{
  private readonly Customer Customer = new Customer();
  public string FirstName
  {
    get { return Customer.FirstName; }
    set { Customer.FirstName = value; }
  }
  public NewClass()
  {
  }
}

如果有两个或多个密封类,或者您根本不想使用继承,您可以对所有工件做同样的事情:

public class NewClass
{
  private readonly Customer Customer = new Customer();
  private readonly PageRequest PageRequest = new PageRequest();
}

Difference between Composition and Aggregation @ C# Cormer

What is the difference between association, aggregation and composition?

C# code for association, aggregation, composition

【讨论】:

  • 我想使用这个类作为获取请求 (someendpoint&firstname=a&currentpage=1&perpage=10),我想知道用户如何提供输入参数作为查询字符串的一部分
  • 调用新类的api端点时,必须是 htttp://someendpoint&Customer.Firstname=a&Customer.LastName=b&currentpage=1&perpage=10 ,消费者可能不满意
  • 无论如何我可以将端点称为someendpoint&firstname=a&currentpage=1&perpage=10
  • 我不知道。我还没有参与这些事情。您应该在这一点上创建另一个问题。
猜你喜欢
  • 1970-01-01
  • 2016-02-23
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多