gpt4 book ai didi

c# - 构造函数中的抽象类型而不是具体类型

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:08 25 4
gpt4 key购买 nike

我有一个对象,假设是在之后返回给客户端的数据他们调用网络方法。

        // 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) 在调用它们的方法时执行不同的逻辑。

您是否知道一种方法可以将这些类缩减为一个类,但仍然使每个类都符合其特殊逻辑而不相同?

最佳答案

如果您的 Concrete1Concrete2Concrete3 类共享相同的方法,您可以将其提取到一个接口(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com