代码之家  ›  专栏  ›  技术社区  ›  UpTheCreek

在C中将数据传递给重写的基方法#

c#
  •  2
  • UpTheCreek  · 技术社区  · 14 年前

    有点愚蠢的问题,但我想知道在C中,将数据从返回到重写基方法的公认方法是什么。

    我想我可以做到:

    class A
    {
        int x;
        public virtual void DoStuff() {
            Console.WriteLine(x);
        }
    }
    
    class B : A
    {
        public override void DoStuff() {
            x = 1;
            base.DoStuff();
        }
    }
    

    但是否有更好的方法,例如不需要使用成员变量?

    4 回复  |  直到 14 年前
        1
  •  8
  •   jdehaan    14 年前

    一个解决方案可以涉及到使用一个有参数的受保护方法来重用基类中的代码。

    class A
    {
        public virtual void DoStuff() {
            DoStuffInternal(0);
        }
        protected void DoStuffInternal(int x) {
            Console.WriteLine(x);
        }
    }
    
    class B : A
    {
        public override void DoStuff() {
            DoStuffInternal(1);
        }
    }
    
        2
  •  2
  •   Maximilian Mayerl    14 年前

    为什么不使用参数?

    class A
    {
        public virtual void DoStuff(int x) {
            Console.WriteLine(x);
        }
    }
    
    class B : A
    {
        public override void DoStuff(int x) {
            //do stuff
            int y = 1
            base.DoStuff(y);
        }
    }
    
        3
  •  2
  •   Mark Heath    14 年前

    怎么样

    abstract class A
    {
        protected abstract int X { get; }
        public void DoStuff() {
            Console.WriteLine(X);
        }
    }
    
    class B : A
    {
        protected override int X { get { return 1; } }
    }
    
        4
  •  0
  •   Community ahmed    7 年前

    你可以用类似的东西 Template Method 设计模式:

    class A
    {
    
        public void DoStuff() {
            var x = DoGetX();
            Console.WriteLine(x);
        }
    
        protected abstract int DoGetX();
    }
    
    class B : A
    {
        protected override int DoGetX() {
          return 1;
        }
    }
    

    因为几乎每个开发人员的属性看起来都像是字段周围的简单包装器,而且我们知道没有类似虚拟字段的东西。因此,我认为抽象方法在这种情况下更可取(我们已经讨论了属性和方法之间的区别 here )