我一直在处理一些抽象的课程,感觉不舒服,但我不知道该怎么做.这是一个简单的例子来解释我的问题:
public abstract class Data
{
protected Boolean _Connected = false;
public abstract void Connect();
public abstract void Disconnect();
public Boolean Connected
{
get { return _Connected; }
}
}
public class SqlServerData : Data
{
public override void Connect()
{
// code to connect to sql server
_Connected = true;
}
public override void Disconnect()
{
if (_Connected)
{
// code to disconnect from sql server
_Connected = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的设计有几个问题.
此设计中的任何内容都不会强制Data的新实现对_connected实例变量执行任何操作.如果使用Data类的其他类依赖于Connected属性,则可能不准确.
这个代码的新手可能会让人感到困惑.此示例非常简单,但如果抽象类中有更多实例变量,而SqlServerData类中有其他实例变量,则更难以了解变量的定义位置.
所以我的问题是,这是否应该重构,如果是,如何?
在基类中实现状态机(连接或未连接,以及这些状态之间的转换),因此派生类不必担心这部分.为实际功能提供受保护的方法,因此派生类可以轻松填写"漏洞":
public abstract class Data
{
private bool connected;
public bool Connected
{
get { return connected; }
}
public void Connect()
{
OnConnect();
connected = true;
}
public void Disconnect()
{
if (connected)
{
OnDisconnect();
connected = false;
}
}
protected virtual void OnConnect() { }
protected virtual void OnDisconnect() { }
}
Run Code Online (Sandbox Code Playgroud)
和
public class SqlServerData : Data
{
protected override void OnConnect()
{
// code to connect to sql server
}
protected override void OnDisconnect()
{
// code to disconnect from sql server
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
695 次 |
| 最近记录: |