如何仅使用基类中的代码返回派生类?

时间:2016-02-24 16:26:27

标签: c# generics inheritance

我最近提出了这个编程问题但未能解决它。我被要求编写一个可以继承的子类,以便下面的代码可以正常运行。这里是catch,基类(我将其命名为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);
隐藏

PartyCustomerCompany都继承了它。

如果从其中一个班级打电话,我怎么能让Party退回客户和公司?我被告知可能使用泛型,但我无法将调用更改为Find<Company>(customer.Id)。但是,我检查的所有资源都表示您无法从基类返回派生类型。

编辑:我通过Customer.Find()Company.Find()调用Party.partyFind()解决了问题,然后将结果转换为其类型。我提交了解决方案以及解释:

  

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

我收到了回复:

  

你错了,泛型可以在不修改的情况下解决这个问题   测试代码;在呼叫网站上专门设置Find,而不是Find<Customer>   允许。您可以了解有关泛型的更多信息。

1 个答案:

答案 0 :(得分:3)

只是查看您的更新,该人正在谈论的内容可能是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