【问题标题】:c# run method from abstract and inheritor with a single instancec# 使用单个实例从抽象和继承者运行方法
【发布时间】:2013-05-19 16:46:52
【问题描述】:

有没有一种方法可以在不显式运行的情况下从抽象类运行我的方法(我的意思是我有相同的方法名称可以继承它,我想要的是同时运行抽象类和继承了他们的惯例)?或任何类型的方法(虚拟覆盖或正常) 或者如果不是,我可以在不使用 base.checker() 的情况下使用它吗?

例子

public abstract class absclass1{
    protected void Checker(){
        Console.WriteLine("from absclass1");
    }
}

public class sample1 : absclass1
{
    protected void Checker(){
        Console.WriteLine("from sample1");
    }
}

如果我有这样的课程要运行:

public class main{
    public void main(){
    sample1 runner = new sample1();
    runner.checker();
    }
}

我希望我的输出为:

from absclass1
from sample

我希望抽象和继承者中名为 checker 的两个方法能够运行,否则我真的需要放置 base.checker();在继承人的检查员处?谢谢,对不起,如果您认为我正在尝试的东西很奇怪或很容易。如果可能的话,请找到一些您知道对我有用的最佳实践。

ps 如果您认为我的问题有问题,请随时编辑

【问题讨论】:

    标签: c# oop methods coding-style abstract-class


    【解决方案1】:

    如果不致电base.Checker,我认为您无法做到这一点。自动调用方法的唯一时间是在构造函数中。因此,您的代码应该调用 base.Checker 以获得所需的结果:

    public abstract class absclass1
    {
        protected void Checker() {
            Console.WriteLine("from absclass1");
        }
    }
    
    public class sample1 : absclass1
    {
        protected void Checker() {
            Console.WriteLine("from sample1");
            base.Checker();
        }
    }
    

    这将输出:

    from sample1
    from absclass1
    

    只是为了向您展示构造函数可以按照您希望的方法工作:

    public abstract class absclass1
    {
        protected absclass1() {
            console.writeln("from absclass1");
        }
    }
    
    public class sample1 : absclass1
    {
        public sample1 () {
            console.writeln("from sample1");
        }
    }
    

    这也会输出:

    from sample1
    from absclass1
    

    唯一的区别是构造函数调用当然只调用一次,而常规方法可以随时调用。

    【讨论】:

    • 既然你提到了构造函数,我可以修改构造函数中的方法吗?就像我想合并课堂上现有的和摘要中的那样,这样我就能得到我想要的结果?
    • @sclang 修改构造函数到底是什么意思?您可以从构造函数中调用方法,因此本质上您可以通过调用构造函数中的方法来组合方法 1 和方法 2。
    • 我的意思是我将修改方法 1,使其类似于方法 1=方法 1+方法 2,在构造器阶段,哈哈哈,无论如何感谢您的意见,我只是想在 checker( ) 是一种不好的做法:)
    • @sclang 啊,我明白了。使用base.Checker() 非常好,你应该使用它。祝你好运!
    【解决方案2】:

    您可以从 sample1 类中调用 base (absclass1):

    public class sample1 : absclass1
    {
    protected void Checker(){
    
      base.Checker()
      console.writeln("from sample1");
     
    }
    

    }

    所以当你执行时:

    public class main{
        public void main(){
        sample1 runner = new sample1();
        runner.checker();
        }
    }
    

    您的输出将是:

    来自 absclass1

    来自样本

    【讨论】:

    • 所以如果不添加base.checker()就无法同时运行两者?
    • 不,但这是一件好事™,因为它提高了可读性。
    • 如果你继承一个抽象类,调用你正在实现的函数的正确方法是使用base。
    猜你喜欢
    • 2019-08-11
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2014-07-10
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多