我正在努力在类之间使用变量和方法。例如,让我们只关注变量。我有两个班级,Foo
和Bar
。我在名为Foo
的{{1}}中不断更改变量。如何从类number
访问此变量?总会只有Bar
类的一个实例。
Bar
我可以想到几个选项。第一 - 单身模式。我可以使所有方法和变量都是静态的,使构造函数成为私有的,只生成一个实例。第二个解决方案是通过构造函数传递class Foo {
private Bar bclass;
public int number = 0;
Foo() {
bclass = new Bar();
}
}
class Bar {
Bar() {
// code
// Access Foo's number from here
}
}
作为参考。但这并没有解决我在number
中访问方法的问题。或者我可以通过构造函数将Foo
的整个实例传递给Foo
:
Bar
我的程序使用了4个不同的类,它们总是只有一个实例,所有这些类都需要以某种方式与主类或彼此之间进行通信(使用它的变量或方法)。你会推荐我哪种方法?将所有4个班级作为单身人士?
很抱歉,如果标题或文字令人困惑,如果我遗漏了某些内容,我会很乐意回复或编辑我的问题。
答案 0 :(得分:2)
好吧,如果你想让你的代码单元可测试,单身不是一个好选择。将其他对象作为私有字段实例化也不是一个好习惯,因为你结合你的代码,我会说更好的选择是在每个类中以特定方法(注入)传递对象,如果你创建接口则更好:
interface IFoo
{
void SetBar(IBar bar);
}
class Foo : IFoo
{
private IBar _bar;
public void SetBar(IBar bar)
{
_bar = bar;
}
}
interface IBar
{
void SetFoo(IFoo foo);
}
class Bar : IBar
{
private IFoo _foo;
public void SetFoo(IFoo foo)
{
_foo = foo;
}
}
class MainClass
{
private IFoo _foo;
private IBar _bar;
public MainClass(IFoo foo, IBar bar)
{
_foo = foo;
_bar = bar;
_foo.SetBar(bar);
_bar.SetFoo(foo);
}
}
class Context // Here you build the structure you want
{
IFoo _foo;
IBar _bar;
MainClass _mainClass;
public Context()
{
_foo = new Foo();
_bar = new Bar();
_mainClass = new MainClass(_foo, _bar);
}
}
这样你的代码就会松散耦合,你可以对它进行单元测试
答案 1 :(得分:1)
您可以完全放弃单例,并且更喜欢在构造函数中注入依赖类的引用。例如,如果Bar
需要来自Foo
的信息,则可以将Foo
作为构造函数参数添加到Bar
。然后在您的主要课程中,您将新的Foo
实例传递给Bar
class Foo {
//...
}
class Bar {
private Foo _foo;
// add Foo as a instance
Bar(Foo foo) {
_foo = foo;
// access foo number here
}
}
class Program {
public static void Main(string[] args) {
var foo = new Foo();
var bar = new Bar(foo);
}
}
答案 2 :(得分:0)
如果您的类具有声明为internal
或public
的字段或属性,则其他类可以访问该字段或属性。如果它是internal
那么它可以被同一个程序集中的其他类访问(项目。)如果它是public
那么它可以被该程序集中的任何类或引用它的其他程序集访问。
// If the class is public then it's visible to other assemblies.
// If the class isn't public then other assemblies can't see public
// members because they can't see the class itself.
public class Foo
{
// Accessible to classes inside the project.
internal string SomeField;
// Accessible to classes outside the project.
public string SomeProperty { get; set; }
}
这是你问题的直接答案。在实践中,我们几乎从不在类之外公开字段(变量)。将这些字段视为类的内部状态。为了使其可预测地工作并防止错误,我们不希望其他类改变该类的状态。
这是一个例子。 (我对汽车的例子不是很疯狂,但无论如何。)
public class Car
{
public int SpeedMilesPerHour;
}
问题是任何其他类都可以将SpeedMilesPerHour
设置为任何内容。它可以从零到8,000到-10,000,000。这可能不是Car
的意图,如果你的车开了3,000英里每小时或20英里每小时,那么你可能有一个错误。
你真的不能指望每一个班级都知道Car
应该能够走多快的速度。你会在整个地方都有重复的代码,以确保正确设置速度。
您可以通过Car
“隐藏”其速度变量并控制其变化来解决此问题。例如,它可能如下所示:
public class Car
{
private int _speed;
public int Speed { get { return _speed; } }
public void GoFaster()
{
if (_speed < 200) _speed++;
}
public void SlowDown()
{
if (_speed > 0) _speed--;
}
}
现在_speed
是内部的。我们添加了一个属性,以便其他类可以查看的速度。但改变它的唯一方法是致电SpeedUp()
或SlowDown()
。该类不允许其他类通过意外更改速度或将其设置为无效数字来搞乱其内部状态。
最好的学习方法之一就是试验。