我正在尝试使用构造函数创建一个类:
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作为参数,构造函数需要在访问类中的所有方法之前检查此进程是否实际存在。
任何人都知道这是可能的吗?
答案 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()
是否可用,您只需检查班级类型。