在这种情况下继承的意义是什么?
本文关键字:是什么 这种情况下 继承 | 更新日期: 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);
}
}
}