最近,我遇到了这个编程问题,但未能解决。我被要求编写一个可以继承的子类,以便下面的代码可以正常运行。这很重要,基类(我称它为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
隐藏。 Customer
和Company
都继承它。当从这些类别之一中调用时,如何使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