我想知道是否有像方法继承,而不是整个类继承的任何功能,让我解释什么,我试图解释:有没有在C#方法继承
class a {
public void GetA(){
// some logic here
}
}
class b {
public void GetB() : new Class().GetA()
}
我知道这看起来奇怪但我正在阅读如何在对象组合模式中进行授权,并且出于某种原因我认为这种模式。
我想知道是否有像方法继承,而不是整个类继承的任何功能,让我解释什么,我试图解释:有没有在C#方法继承
class a {
public void GetA(){
// some logic here
}
}
class b {
public void GetB() : new Class().GetA()
}
我知道这看起来奇怪但我正在阅读如何在对象组合模式中进行授权,并且出于某种原因我认为这种模式。
如果您只是想在GetB()中调用GetA(),但不想在GetB()中定义或明确引用类a的实例,则可以将GetA()作为委托来传递。
在C#中,有许多预定义的代表,如Action和Func。或者,您始终可以推出自己的代理以匹配方法签名。
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);
}
}
哇,看起来很酷,我不知道这样一个通用的解决方案.net已经提供,我一直在创建我自己的代表... – Tarik 2009-12-29 03:57:54
这是不可能的。如果你想b.GetB
重用a.GetA
的功能,那么你需要实例化一个a
并调用a.GetA
。
'青睐构图,而不是继承。 – 2009-12-29 03:00:55
一个常用的组合方法是在类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执行的代码()。
我能想到的最接近的是如何在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
类的构造函数。为什么这个相同的功能不适用于非构造函数方法,我不确定。
“家庭Sapien”是一个论据,对吗? – Tarik 2009-12-29 03:54:35
@Aaron:是的,在'Human'构造函数中,“Home sapien”作为'Animal'构造函数的'物种'参数传递。 – 2009-12-29 16:37:07
稍微不同的方法将在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
}
}
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对象的属性。
如果你使用委托,你必须用相同的逻辑做更多的工作。
但代表可以得到不同的域对象,并做更多的应用程序的事情。
如果木屐()改为静态方法,你可以简单地把它叫做GetB()函数中:
class a {
public static void GetA() {
// some logic here
}
}
class b {
public void GetB() {
a.GetA();
}
}
如果木屐()不是一成不变的,它没有任何意义,因为木屐()根据定义需要一个对象上下文(例如,不可见的“this”指针)。您不能将对象B的实例传递给类A,因为类A不知道类B的任何内容。
你究竟想要做什么?
其实我不是问是否存在相同的方式,也许有另一种方式在C#中做这个提供更好和有效的解决方案。但是整个类的继承并不是我正在寻找的东西。 – Tarik 2009-12-29 02:48:21
是否有任何语言可以实现这一点? – GrayWizardx 2009-12-29 02:49:42
@GrayWizardx当然,这种类型的东西在许多语言中都是可能的,这些语言具有第一类对象的功能。我知道Python和JavaScript允许你做这种事情。 – 2009-12-29 02:50:57