繁体   English   中英

C#中是否有方法继承?

[英]Is there Method Inheritance in C#

我想知道是否有任何功能,如方法继承而不是整个类继承,让我详细说明我想解释的内容:

class a {
   public void GetA(){
     // some logic here
}
}

class b {
    public void GetB() : new Class().GetA()
}

我知道它看起来很奇怪,但我正在阅读如何在对象组合模式中进行委托,我出于某种原因认为这种模式。

进行组合的常用方法是在类b中创建类型为a的私有成员变量,并在GetB()中调用a.GetA()。 例如:

class a {
   public void GetA(){
     // some logic here
   }
}

class b {
    private a _a=new a();

    public void GetB()
    {
         _a.GetA();
    } 
}

另一种选择可能是定义一个名为GetB而不是简单方法的委托成员变量,并允许调用代码提供由GetB()执行的代码。

如果您只想在GetB()中调用GetA(),但不想在GetB()中定义或显式引用类a的实例,则可以将GetA()作为委托传递。

在C#中,有许多预定义的委托,例如ActionFunc 或者,您可以随时滚动自己的委托以匹配方法签名。

    class a
    {
        public void GetA()
        {
            Console.WriteLine("Hello World!");
        }
    }

    class b
    {
        // No explicit reference to class a of any kind.
        public void GetB(Action action)
        {
            action();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var a = new a();
            var b = new b();

            b.GetB(a.GetA);
        }
    }

我能想到的最接近的事情是如何在C#中“继承”一个类的构造函数,而不是它的子类(或同一类的重载构造函数),如下所示:

class Animal {
    public string Species { get; set; }

    public Animal(string species) {
        Species = species;
    }
}

class Human : Animal {
    public string Name { get; set; }

    public Human(string name) : base("Homo sapien") {
        Name = name;
    }
}

上面代码的行为非常简单: Human类的构造函数在执行任何其他操作之前基本上调用了Animal类的构造函数。 为什么非构造函数方法无法使用相同的功能,我不确定。

这是不可能的。 如果你想b.GetB重用的功能a.GetA那么你需要实例化a并调用a.GetA

稍微不同的方法是在ClassB的构造函数中接受ClassA的实例,而不是直接实例化它。 这将把依赖倒置原则应用于@ Ash的答案:

public class ClassB
{
    private readonly ClassA _a;

    public b(ClassA a)
    {
        _a = a;
    }

    public void GetB()
    {
        _a.GetA();

        // Other logic
    }
}
public class Article
{

 public object AddOrUpdate(params object[] paras){

   return null;

  }

}

public class Test:Article
{

 public new object AddOrUpdate(params object[] paras){

   //do your logic......

    return base.AddOrUpdate(paras);

 }


}

你的意思是这个?这是一个类可以做或获取或设置BASE对象属性。

如果你使用委托,你必须用相同的逻辑做更多的工作。

但委托可以获得不同的域对象,并做更多的应用程序。

如果将GetA()更改为静态方法,则只需在GetB()函数中调用它:

class a { 
   public static void GetA() { 
     // some logic here 
   } 
} 

class b { 
    public void GetB() {
      a.GetA();
    }
} 

如果GetA()不是静态的,那么它没有意义,因为GetA()需要一个对象上下文(例如,不可见的“this”指针)。 您不能将对象B的实例传递给A类,因为A类对B类一无所知。

你真的想做什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM