最近,我遇到了这个编程问题,但未能解决。我被要求编写一个可以继承的子类,以便下面的代码可以正常运行。这很重要,基类(我称它为Party)是唯一可以包含Find()代码的类。

var address = new Address("56 Main St", "Town", "AZ", "12345");
var customer = new Customer("John", "Doe", address);
var company = new Company("Town Company", address);

Customer savedCustomer = Customer.Find(customer.Id);
Company savedCompany = Company.Find(company.Id);


Party隐藏。 CustomerCompany都继承它。

当从这些类别之一中调用时,如何使Party返回客户和公司?有人告诉我可以使用泛型,但是我无法将调用更改为Find<Company>(customer.Id)。但是,我检查过的所有资源都说您不能返回基类的派生类型。

编辑:我通过Customer.Find()Company.Find()调用Party.partyFind()解决了问题,然后将结果转换为他们的类型。我连同解释一起提交了解决方案:


  我试图在基类中尽可能多地保留Find功能。
  尽可能的基类,但我不确定如何返回派生
  没有泛型的单个基类中的类型(这需要
  仍然修改测试代码)


我收到了回复:


  您误会了,泛型可以解决此问题,而无需修改
  测试代码;在呼叫站点将Find专门化为Find<Customer>
  允许的。您需要了解有关泛型的更多信息。

最佳答案

仅查看您的更新,此人正在谈论的内容可能是Party专长:

public class Party<T>
{
    public static T Find(int id)
    {
         ...
    }
}

public class Customer : Party<Customer>{}
public class Company : Party<Company>{}


这样,实际上可以在派生类上静态调用Find,而无需将泛型类型显式传递给Find方法。

var cust = Customer.Find(1); // returns instance of Customer
var comp = Company.Find(2); // returns instance of Company


实时示例:http://rextester.com/GPDFI94766

08-26 19:02
查看更多