创建一个类的构造函数

创建一个类的构造函数

问题描述:

我试图创建一个类构造函数:创建一个类的构造函数

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; 
    } 

} 

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

我需要一个名为“进程”类在构造函数需要一个进程ID一个参数,构造函数在访问类中的所有方法之前需要检查该过程是否真正存在。

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

+0

听起来像你真的需要重新设计你的课程。 – BrokenGlass

+0

@BrokenGlass:是的,那么..没有任何,我只是在学习。有任何想法吗? – Drahcir

+0

这取决于用例 - 为什么'DoMath()'有时不可用?如果你的班级在某些情况下表现不同*如果是这样,你能否将这种变化的行为提取出来分类到不同的类中? – BrokenGlass

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

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

,并在构造函数中设置this.canDoMath至于你是否能够做数学。那么如果this.canDoMath为假但调用该方法,则应该有DoMath抛出InvalidOperationException

由于只有在运行时才能知道2个参数的相等性,所以不能进行编译时检查来隐藏部分代码中的方法。然而,你可以抛出一个例外DoMath()在不好的时间被调用。这是例外的完美用法,因为大概DoMath()的调用者应该知道更好。

你最好打赌是根据输入的构造函数检查的结果设置一个标志。然后在DoMath方法中抛出异常,如果它不应该可用。你真的不能带走的方法在运行时,因为它是在已经编译

我想,如果给定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,但这听起来不太可能来自您的描述。

不知道你的情况,其余的我不能说这是否是一个好主意或没有,但你可以做的是使用继承:

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()可你刚检查班级类型。