2009-12-29 80 views
3

我想知道是否有像方法继承,而不是整个类继承的任何功能,让我解释什么,我试图解释:有没有在C#方法继承

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

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

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

+0

其实我不是问是否存在相同的方式,也许有另一种方式在C#中做这个提供更好和有效的解决方案。但是整个类的继承并不是我正在寻找的东西。 – Tarik 2009-12-29 02:48:21

+0

是否有任何语言可以实现这一点? – GrayWizardx 2009-12-29 02:49:42

+0

@GrayWizardx当然,这种类型的东西在许多语言中都是可能的,这些语言具有第一类对象的功能。我知道Python和JavaScript允许你做这种事情。 – 2009-12-29 02:50:57

回答

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); 
     } 
    } 
+0

哇,看起来很酷,我不知道这样一个通用的解决方案.net已经提供,我一直在创建我自己的代表... – Tarik 2009-12-29 03:57:54

1

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

+1

'青睐构图,而不是继承。 – 2009-12-29 03:00:55

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执行的代码()。

+0

你能告诉我做这种模式的好处吗?谢谢。 – Tarik 2009-12-29 03:53:04

+0

@Aaron,这样做的好处与一般使用组合物的好处相同。它允许你隐藏关于你的实现的更多细节,然后继承。在这个例子中,类B的调用者不需要知道你实际使用类A来实现GetB()。所以它通常比继承更灵活和松散耦合。 – Ash 2009-12-29 04:02:33

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类的构造函数。为什么这个相同的功能不适用于非构造函数方法,我不确定。

+0

“家庭Sapien”是一个论据,对吗? – Tarik 2009-12-29 03:54:35

+0

@Aaron:是的,在'Human'构造函数中,“Home sapien”作为'Animal'构造函数的'物种'参数传递。 – 2009-12-29 16:37:07

0

稍微不同的方法将在ClassB构造函数接受ClassA一个实例,而不是直接将其实例化。这将被应用到Dependency Inversion Principle灰@的回答:

public class ClassB 
{ 
    private readonly ClassA _a; 

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

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

     // Other logic 
    } 
} 
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); 

} 


} 

你的意思是这样,这是inhret一个类可以不获取或设置BASE对象的属性。

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

但代表可以得到不同的域对象,并做更多的应用程序的事情。

0

如果木屐()改为静态方法,你可以简单地把它叫做GetB()函数中:

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

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

如果木屐()不是一成不变的,它没有任何意义,因为木屐()根据定义需要一个对象上下文(例如,不可见的“this”指针)。您不能将对象B的实例传递给类A,因为类A不知道类B的任何内容。

你究竟想要做什么?