【问题标题】:Call a method in parent class调用父类中的方法
【发布时间】:2013-03-21 16:17:22
【问题描述】:

这是我的设置,评论显示了我想要做什么:

class Process
{
    void SomeMethod()
    {
        // Here I want to call Parent.MethodToCall()
    }
}

class Controller
{
    Process c = new Process();

    void MethodToCall()
    {
    }
}

现在Controller.MethodToCall() 将在Process 类的整个生命周期中被多次调用。

这只是需要调用的父方法,所以我认为使用event 会有点浪费,因为我永远不会删除处理程序并且只会调用一次。

所以我目前用来解决这个问题的方法如下:

class Process
{
    public Func<void> Method { get; set; }

    void SomeMethod()
    {
        Method();
    }
}

class Controller
{
    Process c = new Process() { Method = MethodToCall }

    void MethodToCall()
    {
    }
}

首先,语法可能不完美,我很快在记事本中敲了它。

我的问题:什么是实现我想要的最好的方法,因为我正在做的事情看起来很混乱?......或者我在设计方面完全错误地考虑了这个?

基本上我想要做的是在 Controller 类中调用一个方法而不将其公开,因为如果它是公开的,我可以简单地将 Controller 作为参数传递给 Process。

【问题讨论】:

  • 继承怎么样?孩子:父母
  • 父/子名称让我们考虑继承,但事实并非如此,否则您可以简单地使其受到保护(或者......它是?)。最好的解决方案(如果委托不是您想要的)可能涉及一个接口(这是您甚至可以拥有私有继承的唯一情况)但您应该描述 ...什么更好另一个案例可能不好(你不会得到关于如何调用方法的 1000 个答案......)
  • 我同意..基于任一场景 Children 可以拥有 Multiple Parents` 和 Parents 可以拥有 Multiple Children 有关 OP 打算如何使用或正在使用的更多信息在提供最佳答案方面对我们其他人最有利
  • 已编辑,抱歉,这不是继承问题。
  • 只需为您的属性方法使用 System.Action。控制器可以将其设置为自己的方法或匿名委托(或任何您可能需要的)。有了更多信息,可能会有更好的解决方案,但这应该可行。

标签: c# oop class


【解决方案1】:
class Child
{
    Parent parent=null;
    public Child(Parent p)
    {
      parent=p;
    }
    void SomeMethod()
    {           
        parent.MethodToCall();
    }
}

【讨论】:

  • 子类中没有声明“父”引用。
  • 谁编辑了我的代码?然后投反对票?我有这个代码!对那些删除我的代码并投反对票的人感到羞耻!
  • 不是我,我认为如果有对父母的参考,这是一个很好的选择
  • 太糟糕了,我正在格式化我的代码,而有人做得很糟糕,错误地删除了我的代码。他在做什么?为什么? :)
  • 再次看到这是我想避免的事情,因为您必须公开该方法,正如我在 OP 中所说的那样。
【解决方案2】:

这应该是一个很好的例子来说明如何做到这一点

class Child : Parent
{
    private void SomeMethod()
    {
        base.MethodToCall();
    }
}

class Parent
{
    Child c = new Child();

    protected void MethodToCall()
    {
        c.MethodToCall();//not sure if you are wanting to call c.MethodToCall();
    }
}

【讨论】:

    【解决方案3】:

    嗯,用 OOP 术语来说,正确的答案如下:

    class Child : Parent
    {
        void SomeMethod()
        {
            base.MethodToCall();
        }
    }
    
    class Parent
    {
        protected void MethodToCall()
        {
           // protected methods are accesible from
           // descendants and private from outside
        }
    }
    

    但是你总是可以避免继承,使用aggregation

    【讨论】:

    • 孩子可以有多个父母。我认为这不是最好的解决方案。
    • 这不是多重继承你在哪里看到的..?
    • @DJKRAZE:我试图理解 AshBurlaczenko 的评论
    • 这里也一样..LOL 他的评论没有意义你在做SINGLE Inheritance 只有一个: 并且没有额外的, 真正表明你正在使用单一继承跨度>
    • 哈哈,那是因为他可能不懂基本的OOP Concepts 你的答案对我来说很好我会赞成你的答案,因为我们几乎有相同的答案..我刚刚发布了一个Child.FunctionToCall
    【解决方案4】:

    您所做的实际上是滚动您自己的事件。在内部,事件处理程序只是附加到事件的委托,不同之处在于只有事件的所有者才能引发它。

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 2019-05-18
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2011-12-10
      • 2020-01-14
      相关资源
      最近更新 更多