我想知道是否有像方法继承而不是整个类继承这样的特性,让我详细说明我要解释的内容:
class a {
public void GetA(){
// some logic here
}
}
class b {
public void GetB() : new Class().GetA()
}
我知道这看起来很奇怪,但我正在阅读如何在对象组合模式中进行委托,并且出于某种原因我认为这种模式。
我想知道是否有像方法继承而不是整个类继承这样的特性,让我详细说明我要解释的内容:
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);
}
}
进行组合的常用方法是在 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
为什么非构造方法不能使用相同的功能,我不确定。
这是不可能的。如果要b.GetB
重用 的功能,a.GetA
则需要实例化 ana
并调用a.GetA
。
稍微不同的方法是ClassA
在 的构造函数中接受 的实例ClassB
,而不是直接实例化它。这会将依赖倒置原则应用于@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 类一无所知。
你真正想做什么?