3

我想知道是否有像方法继承而不是整个类继承这样的特性,让我详细说明我要解释的内容:

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

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

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

4

7 回答 7

4

如果您只想在 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);
        }
    }
于 2009-12-29T02:57:39.363 回答
4

进行组合的常用方法是在 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() 执行的代码。

于 2009-12-29T02:49:32.827 回答
3

我能想到的最接近的事情是,在 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为什么非构造方法不能使用相同的功能,我不确定。

于 2009-12-29T02:54:05.003 回答
1

这是不可能的。如果要b.GetB重用 的功能,a.GetA则需要实例化 ana并调用a.GetA

于 2009-12-29T02:43:49.187 回答
0

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

public class ClassB
{
    private readonly ClassA _a;

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

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

        // Other logic
    }
}
于 2009-12-29T03:12:01.970 回答
0
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 对象属性的原因。

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

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

于 2009-12-29T03:17:16.280 回答
0

如果将 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 类一无所知。

你真正想做什么?

于 2009-12-29T03:36:25.400 回答