在这种情况下,继承的重点是什么?

时间:2014-03-26 18:04:35

标签: c# asp.net

我有几个类必须连接到某些东西才能执行任何操作。理想情况下,我使用带有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();

不幸的是,构造函数不是继承的,所以这些都不起作用。我知道对此的修复,但它要求我修改每一个类。

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

感谢。

1 个答案:

答案 0 :(得分:1)

编辑: 在回复您的评论如下:

  

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

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

Duplicate code is a very strong code smell that you should look to eliminate as soon as possible

为了消除重复,您可以add a has-a relationship进行重复操作。创建一个ConnectionFangler类,所有的橡皮擦类都引用它来管理它们的连接。或者通过创建一个绑定连接的基类来讨论add an is-a relationship


如果您的所有基类都在设置连接字符串,那么我说这里没有继承点。继承应该是一种关系,而不是一种关系。

因为您似乎不想添加对基础构造函数的调用....

如果你想确保每种类型的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);
        }
    }
}