如何清除继承的实例变量?

all*_*.mn 4 c# oop

我一直在处理一些抽象的课程,感觉不舒服,但我不知道该怎么做.这是一个简单的例子来解释我的问题:

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)

我的设计有几个问题.

  1. 此设计中的任何内容都不会强制Data的新实现对_connected实例变量执行任何操作.如果使用Data类的其他类依赖于Connected属性,则可能不准确.

  2. 这个代码的新手可能会让人感到困惑.此示例非常简单,但如果抽象类中有更多实例变量,而SqlServerData类中有其他实例变量,则更难以了解变量的定义位置.

所以我的问题是,这是否应该重构,如果是,如何?

dtb*_*dtb 6

在基类中实现状态机(连接或未连接,以及这些状态之间的转换),因此派生类不必担心这部分.为实际功能提供受保护的方法,因此派生类可以轻松填写​​"漏洞":

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)