C# 在C中访问内部绑定类方法的更好方法是什么?

C# 在C中访问内部绑定类方法的更好方法是什么?,c#,class,properties,C#,Class,Properties,访问内部绑定类的更好和优化的方法是什么 通过公共财产 通过方法调用 通过类MyClass3调用MyClass2的方法MyClass2Method的最佳实践是什么。MyClass2未在MyClass3中引用 第一条路还是第二条路?我在评论中写的一个例子: interface DancesWithWolves { void DanceWithWolves(); } class MyClass2 : DancesWithWolves { public void DanceWithWo

访问内部绑定类的更好和优化的方法是什么

通过公共财产

通过方法调用

通过类MyClass3调用MyClass2的方法MyClass2Method的最佳实践是什么。MyClass2未在MyClass3中引用


第一条路还是第二条路?

我在评论中写的一个例子:

interface DancesWithWolves
{
    void DanceWithWolves();
}

class MyClass2 : DancesWithWolves
{
    public void DanceWithWolves() { /* ... */ }
}

class MyClass1 : DancesWithWolves
{
    private readonly DancesWithWolves m_myClass2;

    public MyClass1(DancesWithWolves myClass2)
    {
        m_myClass2 = myClass2;
    }

    public void DanceWithWolves()
    {
        m_myClass2.DanceWithWolves();
    }
}

class MyClass3
{
     public void MyClass3Method(DancesWithWolves myClass1)
     {
        myClass1.DanceWithWolves();
     }
}
这不仅可以从MyClass3中隐藏MyClass2,还可以让您稍后通过简单地注入接口的另一个实现来交换MyClass1的行为

Keith在他的回答中已经提到了Demeter定律,如果您想弄清楚为什么要使用接口并避免像way 1那样的强依赖性,这也值得一读


注意:这不是一个总是这样做的方法-在某些情况下,您实际上希望将MyClass2的实例返回给客户机。我的答案基于您给出的示例代码,因此假设这里不是这样。如果您现在感到困惑,请参阅Lasse的评论

我在评论中写的一个例子:

interface DancesWithWolves
{
    void DanceWithWolves();
}

class MyClass2 : DancesWithWolves
{
    public void DanceWithWolves() { /* ... */ }
}

class MyClass1 : DancesWithWolves
{
    private readonly DancesWithWolves m_myClass2;

    public MyClass1(DancesWithWolves myClass2)
    {
        m_myClass2 = myClass2;
    }

    public void DanceWithWolves()
    {
        m_myClass2.DanceWithWolves();
    }
}

class MyClass3
{
     public void MyClass3Method(DancesWithWolves myClass1)
     {
        myClass1.DanceWithWolves();
     }
}
这不仅可以从MyClass3中隐藏MyClass2,还可以让您稍后通过简单地注入接口的另一个实现来交换MyClass1的行为

Keith在他的回答中已经提到了Demeter定律,如果您想弄清楚为什么要使用接口并避免像way 1那样的强依赖性,这也值得一读


注意:这不是一个总是这样做的方法-在某些情况下,您实际上希望将MyClass2的实例返回给客户机。我的答案基于您给出的示例代码,因此假设这里不是这样。如果您现在感到困惑,请参阅Lasse的评论

您遇到了一个叫做的软件原则,它基本上是尽可能少的知识的原则

一般来说,最好只访问Myclass1上的方法,而不知道任何其他类是否存在


更好的方法可能是根据实际的上下文通过一个接口。

您遇到了一个名为的软件原则,这基本上是尽可能少的知识的原则

一般来说,最好只访问Myclass1上的方法,而不知道任何其他类是否存在


更好的方法可能是根据实际环境通过接口。

这一切都与抽象有关,因为我喜欢糟糕的比较,所以我将它与汽车进行比较

要启动汽车,您需要启动内燃机:

public class Car
{
    private IEngine _engine;

    public Car(IEngine engine)
    {
        _engine = engine;
    }

    public void StartMoving()
    {
        if (_engine is CombustionEngine ce)
       {
            ce.FireSparkPlugs();
       }
       else
       {
            // ...
       }
    }
}

现在考虑另一种选择,在这里你将汽车内脏返回给呼叫者,无论你通过方法还是财产都没关系:

public class Car
{
    private IEngine _engine;

    public Car(IEngine engine)
    {
        _engine = engine;
    }

    public IEngine GetEngine()
    {
        return _engine;
    }
}
现在,打电话的人必须知道汽车需要什么样的发动机才能让它移动,而他们不应该这样做,因为他们在抽象的层面上处理汽车:一辆汽车。他们只是想让车辆开始移动,他们不想知道车辆实际上是如何移动的

现在,你不能改变你进入汽车的引擎类型,因为那样打电话的人就会坏掉


另一方面,如果你想让打电话的人能够检查发动机,因为这对汽车的某些操作是有意义的,那么当然,你可以把它暴露出来

这一切都与抽象有关,因为我喜欢糟糕的比较,所以我将它与汽车进行比较

要启动汽车,您需要启动内燃机:

public class Car
{
    private IEngine _engine;

    public Car(IEngine engine)
    {
        _engine = engine;
    }

    public void StartMoving()
    {
        if (_engine is CombustionEngine ce)
       {
            ce.FireSparkPlugs();
       }
       else
       {
            // ...
       }
    }
}

现在考虑另一种选择,在这里你将汽车内脏返回给呼叫者,无论你通过方法还是财产都没关系:

public class Car
{
    private IEngine _engine;

    public Car(IEngine engine)
    {
        _engine = engine;
    }

    public IEngine GetEngine()
    {
        return _engine;
    }
}
现在,打电话的人必须知道汽车需要什么样的发动机才能让它移动,而他们不应该这样做,因为他们在抽象的层面上处理汽车:一辆汽车。他们只是想让车辆开始移动,他们不想知道车辆实际上是如何移动的

现在,你不能改变你进入汽车的引擎类型,因为那样打电话的人就会坏掉


另一方面,如果你想让打电话的人能够检查发动机,因为这对汽车的某些操作是有意义的,那么当然,你可以把它暴露出来

我建议按照方式2的方向使用接口和giong,但使用接口而不是具体的类。MyClass3不关心它在MyClass1中是如何完成的,它也不需要关心它与方式1的关系。你能解释一下是什么使方式2比方式1更合适吗?或者至少是这样一种解释的参考?你问的是更好、优化和最佳实践,所有这些都是基于观点的。您是否关心某个特定方面?这些类实际上代表什么?你对OO设计原则了解多少?你的研究表明了什么?@CodeCaster我提供了一个例子,t,使上下文变得如此狭窄
o避免含糊不清。我不希望有个人的意见,我只希望有一个面向对象的设计原则来解决这种模式!这里的问题是,这要视情况而定。您可以通过属性访问的另一个类在总体实现中更详细吗?然后将其隐藏在曲面对象上的新方法和属性后面。它是否是一个完整的组成部分,独立发挥作用?然后通过属性或方法调用将其表面化,即返回对象。对于这种情况,答案不会说总是执行X。我建议按照方式2的方向使用接口和giong,但使用接口而不是具体的类。MyClass3不关心它在MyClass1中是如何完成的,它也不需要关心它与方式1的关系。你能解释一下是什么使方式2比方式1更合适吗?或者至少是这样一种解释的参考?你问的是更好、优化和最佳实践,所有这些都是基于观点的。您是否关心某个特定方面?这些类实际上代表什么?你对OO设计原则了解多少?你的研究表明了什么?@CodeCaster为了避免含糊不清,我通过提供一个例子来缩小背景。我不希望有个人的意见,我只希望有一个面向对象的设计原则来解决这种模式!这里的问题是,这要视情况而定。您可以通过属性访问的另一个类在总体实现中更详细吗?然后将其隐藏在曲面对象上的新方法和属性后面。它是否是一个完整的组成部分,独立发挥作用?然后通过属性或方法调用将其表面化,即返回对象。在这种情况下,不会有答案说总是做X。我也喜欢糟糕的比较:D+1一些否决票仍然是个谜。我也喜欢糟糕的比较:D+1一些否决票仍然是个谜。