在子类

时间:2015-10-08 07:13:42

标签: c# exception-handling subclass

我的问题是:

  1. 如何在connect()方法(传播)中使用异常?
  2. 我应该使用这个关键字(this.Open()...还是Open()就够了?)
  3. 给定基类:

    class BaseClient
    {
        public BaseClient(string host, string port);
        public void Open();
        public bool Authenticate();
        public void Close();
    }     
    

    创建对象的实例并建立连接:

    BaseClient client = new BaseClient(host, port);
    
    try
    {
        client.Open();
        bool flag = !client.Authenticate();
        if (flag)
        {
            throw new SNException();
        }
    }
    catch (Exception ex)
    {
        bool flag = client.State == State.Opened;
        if (flag)
        {
            client.Close();
        }
    }
    

    现在我希望继承BaseClient,并在一个方法connect()中包含Open()和Authenticate()方法。

    class ChildClient : BaseClient
    {
        public ChildClient(string host, string port) : base(string host, string port);
        public void connect();
        public void disconnect();
    }
    

    其中:

    public void connect()
    {
        this.Open();
        ...
        this.Authenticate();
        ...
    }
    
    public void disconnect()
    {
        this.Close();
    }
    

2 个答案:

答案 0 :(得分:0)

  

1.如何在connect()方法(传播)中使用异常?

如果您无法在connect内处理错误,例如捕获它并默默返回布尔值false,请不要做任何事情 - 请保留您的代码原样。

  
      
  1. 我应该使用这个关键字(this.Open()...还是Open()就够了?)
  2.   

如果您使用的方法标识符与其他已定义的方法不匹配,则不需要使用 this (例如,using NamespaceWithAuthenticate;会破坏该方法)。使用 this 来解析方法是隐含的。

答案 1 :(得分:0)

1。如何在connect()方法(传播)中使用异常?

枚举类型

public enum State {OK, WARNING, ERROR, OPENED, CLOSED};

初始化Exception类的新实例。

internal class SNException : Exception
{
    private State _state;

    public State GetState
    {
        get { return this._state; }
    }

    public SNException()
    {
    }

    public SNException(State state)
    {
        this._state = state;
    }

    public SNException(string message)
        : base(message)
    {
    }

    public SNException(string message, Exception innerException)
        : base(message, innerException)
    {
    }

    protected SNException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
        : base(info, context)
    {
    }
}

BaseClient类

class BaseClient
{   
    private string host = "";
    private string port = "";

    public BaseClient(string host, string port)
    {
        this.host = host;
        this.port = port;
    }

    public void Open()
    {
        throw new SNException(State.CLOSED);
    }

    public bool Authenticate()
    {
        return false;
    }

    public void Close()
    {}
}     

类BaseClient inhertis基于BaseClient类

class ChildClient : BaseClient
{
    public ChildClient(string host, string port) : base(host, port)
    {
    }

    public bool connect()
    {
        this.Open();

        return this.Authenticate();
    }

    public void disconnect()
    {
        this.Close();
    }
}

调用对象

ChildClient childClietn = new ChildClient("host", "port");
try
{
    bool result = childClietn.connect();
}
catch (SNException ex)
{
    var st = ex.GetState;
}
finally
{
    childClietn.disconnect();
}

2。我应该使用这个关键字(this.Open()...或Open()就足够了吗?)

this 关键字引用类的当前实例,并且还用作扩展方法的第一个参数的修饰符。

    public BaseClient(string host, string port)
    {
        this.host = host;
        this.port = port;
    }

如果方法或构造函数中的此参数与对象中的变量具有相同的名称,则需要明确指出在何处指定值。