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

标签 c# .net polymorphism abstract-class

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

        // 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/

相关文章:

.net - 日志框架与 System.Diagnostics 跟踪

c# - 自定义 Log4Net 过滤器级别不写入日志

c# - Umbraco v5,MVC

python - Python 中的基本多态性混淆

c++ - 在虚函数中访问派生类成员变量

c# - 从 C# 调用具有复杂用户定义类型 (UDT) 的 VB6 DLL 函数

c# - 有关显示图形和图表的建议

java - 这就是所谓的重载吗?

c# - 如何实现 getDirectContent() itextsharp

c# - Kong Solutions 拖放以对列表进行排序,从列表中删除项目