我有一个对象,假设是在之后返回给客户端的数据 他们调用网络方法。
// NewData1.cs
public NewData1(Concrete1 con)
{
ID = con.ID;
var results= con.listOfResults();
var something= con.GetSomething();
Something = new List<Somethings>();
con.DoSomething();
}
// NewData2.cs
public NewData2(Concrete2 con)
{
ID = con.ID;
var results= con.listOfResults();
var something= con.GetSomething();
Something = new List<Somethings>();
con.DoSomething();
}
// NewData3.cs
public NewData3(Concrete3 con)
{
ID = con.ID;
var results= con.listOfResults();
var something= con.GetSomething();
Something = new List<Somethings>();
con.DoSomething();
}
如您所见,这些类做同样的事情(这不是我的代码……我想更改它)。 唯一不同的是具体类型 (1,2,3) 在调用它们的方法时执行不同的逻辑。
您是否知道一种方法可以将这些类缩减为一个类,但仍然使每个类都符合其特殊逻辑而不相同?
最佳答案
如果您的 Concrete1
、Concrete2
和 Concrete3
类共享相同的方法,您可以将其提取到一个接口(interface)并让他们实现:
// an interface is simply a contract
interface ICanGetSomething
{
int ID { get; }
List<Result> ListOfResults();
Something GetSomething();
}
// your concrete classes should all implement the same interface
class Concrete1 : ICanGetSomething { ... }
class Concrete2 : ICanGetSomething { ... }
class Concrete3 : ICanGetSomething { ... }
这样你只需要一个方法来处理所有这些:
public void NewData(ICanGetSomething con)
{
ID = con.ID;
var results = con.ListOfResults();
var something = con.GetSomething();
...
}
如果它们也共享相同的功能,您还可以使用一个通用的抽象类来重用所有通用代码:
abstract class Base : ICanGetSomething { ... }
// your concrete classes should all inherit from the same base class
class Concrete1 : Base { ... }
class Concrete2 : Base { ... }
class Concrete3 : Base { ... }
无论哪种方式,我都建议使用接口(interface) 来定义契约。由于 C# 不支持多重继承,因此您不想强制所有具体实现都派生自单个基类(除非有必要)。这仍然意味着您将在有共享功能的地方使用继承,但是您的 NewData
方法应该接受参数的接口(interface),而不是基类。
关于c# - 构造函数中的抽象类型而不是具体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18337804/