在这种情况下继承的意义是什么?

本文关键字:是什么 这种情况下 继承 | 更新日期: 2023-09-27 17:53:53

我有几个类,必须连接到的东西之前,他们可以做任何事情。因此,理想情况下,我创建一个带有1个参数的构造函数的基类。然后这些类从这个基类继承,就像这样:

public class BaseErase
{
    private string _connectionString;
    public string ConnectionString
    {
        get 
        {
           return _connectionString; 
        }
        set 
        {
           _connectionString = value; 
        }
    }
    public BaseErase(string connectionString)
    {
        ConnectionString = connectionString;
    }
    //public void SetConnection(string connectionString)
    //{
    //    ConnectionString = connectionString;
    //}
}

那么我的派生类将继承BaseErase,就像这样:

class ToEraseClass : BaseErase
{
    public void GetData()
    {
        string connect = ConnectionString;
        Console.WriteLine(connect);
    }
}

最后,我实例化我的类并调用GetData():

ToEraseClass toErase = new ToEraseClass(ConnectionString);
toErase.GetData();

不幸的是,构造函数不是继承的,所以这些都不起作用。我知道如何解决这个问题,但这需要我修改每一个类。

我的问题是,这里继承的目的是什么?

谢谢。

在这种情况下继承的意义是什么?

编辑:回复你的评论:

在这种情况下,我可以很容易地在每个类中添加一个方法

在这种情况下,继承所做的是消除在每个类中添加方法的需要。因为如果你在每个类中添加方法,那么你就必须在每个类中维护该方法。

重复代码是一种非常强烈的代码气味,你应该尽快消除

为了消除重复,你可以添加一个has-a关系,例如,创建一个ConnectionFangler类,所有的橡皮擦类都引用它来管理它们的连接。或者,正如我们讨论的那样,您可以通过创建一个基类来添加一个is-a关系,该基类将连接连接在一起。


如果你的基类所做的就是设置一个连接字符串,那么我想说这里没有继承的意义。继承应该是一个is-a关系,而不是一个has-a关系。

由于您似乎不想添加对基构造函数的调用....

如果你想确保每个类型的Erase类都有一个连接字符串,你可以让它们实现一个具有该属性的接口

public IEraseConnection 
{
  string ConnectionString {get;set;}
}

你可以在构造函数中或者直接设置连接字符串。以最适合您的应用程序为例。

为了完整,如果你想使用基类,那么我会这样做:

using System;
namespace ExampleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            new ToEraseClass("Boom!").GetData();
            Console.ReadLine();
        }
    }
    public class BaseErase
    {
        protected string ConnectionString
        {
            get; private set;
        }
        public BaseErase(string connectionString)
        {
            ConnectionString = connectionString;
        }
    }
    public class ToEraseClass : BaseErase
    {
        public ToEraseClass(string connectionString) : base(connectionString) 
        {}
        public void GetData()
        {
            Console.WriteLine(ConnectionString);
        }
    }
}