创建一个类构造函数

时间:2011-11-18 20:15:21

标签: c#

我正在尝试使用构造函数创建一个类:

class MyClass
{
    public int VAR1;
    public int VAR2;

    public MyClass(int var1, int var2)
    {
        this.VAR1=var1;
        this.VAR2=var2;
    }

    public int DoMath()
    {
        return this.VAR1+this.VAR2;
    }

}

好的,该示例可能会起作用,一旦构造出DoMath方法将在类实例中可用。

我想要做的是在构造函数中运行一些方程式,并且根据结果,DoMath方法可能会也可能不会可用。所以像这样:

class MyClass
{
    public int VAR1;
    public int VAR2;

    public MyClass(int var1, int var2)
    {
        if(var1==var2) /*HERE IT CHECKS IF THE VARS ARE THE SAME*/
        {              /*IF THEY'RE NOT THE SAME THEN THE DoMath METHOD IS UNAVAILABLE*/
            this.VAR1=var1;
            this.VAR2=var2;
        }
    }

    public int DoMath()
    {
        return this.VAR1+this.VAR2;
    }

}

显然这只是一个例子,但另一种解释方式是:

我需要一个名为“Process”的类,其中构造函数将进程id作为参数,构造函数需要在访问类中的所有方法之前检查此进程是否实际存在。

任何人都知道这是可能的吗?

5 个答案:

答案 0 :(得分:3)

这是不可能的,因为你想要它。你能做的是提供一个属性

private readonly bool canDoMath;
public bool CanDoMath { get { return this.canDoMath; } }

并在构造函数中设置this.canDoMath,以确定是否可以进行数学运算。然后,如果DoMath为false,则应InvalidOperationException抛出this.canDoMath,但会调用该方法。

答案 1 :(得分:3)

我会创建一个静态工厂方法,如果具有给定id的进程不存在,则返回null:

public class Process
{
    private Process(...)
    {
    }

    public static Process GetById(int processId)
    {
        if(ProcessExists(processId))
        {
            //get process details
        }
        else return null;
    }
}

根据此课程的方法,您可以返回null object而不是null,但这听起来不太可能。

答案 2 :(得分:0)

由于2个参数的相等性仅在运行时已知,因此您无法进行编译时检查以隐藏代码部分中的方法。但是,您可以抛出DoMath()的异常,这是在错误的时间调用的。这是异常的完美用法,因为大概DoMath()的调用者应该知道更好。

答案 3 :(得分:0)

您最好的选择是根据构造函数检查输入的结果设置一个标志。如果它不可用,则在DoMath方法中抛出异常。你不能真正在运行时删除该方法,因为它已经编译好了。

答案 4 :(得分:0)

在不知道其他情况的情况下,我不能说这是不是一个好主意,但你可以做的是使用继承:

class MyClass
{
    public int VAR1;
    public int VAR2;

    private MyClass()
    {
    }

    public static MyClass MakeInstance(int var1, int var2)
    {
        if(var1==var2)
        {
            return new MySubClass1(var1, var2);
        }
        else
        {
            return new MySubClass2();
        }

    }
}

class MySubClass1 : MyClass
{

    public MySubClass1(int var1, int var2)
    {
            this.VAR1=var1;
            this.VAR2=var2;
    }

    public int DoMath()
    {
        return this.VAR1+this.VAR2;
    }
}

class MySubClass2 : MyClass
{
  public MySubClass2()
  {
  }
  //Same as MySubClass1 except no DoMath()
}

然后检查DoMath()是否可用,您只需检查班级类型。