【问题标题】:C# Access base class variables/functions from abstract classC#从抽象类访问基类变量/函数
【发布时间】:2021-07-21 13:37:12
【问题描述】:

也许这是不可能的,或者我混淆了一些东西,但它打破了我的头。

假设我们有一个抽象类 A 和一个基于 A 的类 B。A 是否可以从 B 访问变量/函数?

例子:

 abstract class A
 {
    public bool activeA = false;

    public bool getState()
    {
        return test; // The variable from class B
    }
 }

 class B : A
 {
    public bool test = true;

    public void isActive()
    {
         return base.getState(); // So this should return true because getState() should access the variable test^^
    }

 }

【问题讨论】:

  • 嗯...抽象类不能被实例化,所以它不能访问class B 中存在的变量。见:abstract class
  • 您是否正在尝试解决某个特定问题?可能有更好的方法,但如果没有关于该问题的更多信息,我不确定该建议什么。
  • 他们似乎如此纠缠不清,不清楚为什么你不只是有一个 AB 类。也许给我们一个更具体的例子?
  • 如果A 的子类没有test 字段怎么办?它不可能工作。也许您想将getState() 移动到B,或者甚至将其抽象化,以便B 可以使用自己的细节来实现它。

标签: c# class inheritance abstract


【解决方案1】:

不,这是不可能的。 AB 或可能的 C..Z 一无所知。

如果testA 上,那么AB 都可以访问它。或者,您可以创建一个由B 实现且A 知道的接口并将B 作为参数传递给A

这可能看起来像这样:

interface IB
{
    bool Test { get; }
}

abstract class A
{
   public bool activeA = false;

   public bool getState(IB arg)
   {
       return arg.Test;
   }
}

class B : A, IB
{
   public bool Test => true;

   public bool isActive()
   {
         return base.getState(this); 
    }
 }

【讨论】:

  • 你不是认真的吧? ;-) 你的解决方案在技术上是可行的,但它并不是一个真正可行的解决方案,因为它很难理解。
  • @Valvastino 看到它被标记为答案,我希望它对最初的提问者有所帮助。难以理解取决于您的用例。如果你真的遇到这样的场景,这可能是一个可以接受的解决方案。你有什么建议?
  • 好吧,我在下面发布了对原始问题的答案。一个简单的解决方案是使用抽象基类作为抽象。含义:声明必须在派生类中实现的抽象方法/属性。更少的代码和需要理解的“循环”依赖。
【解决方案2】:

不,这是不可能的。抽象类对继承自它的类一无所知,因此它不能使用它们的属性。

【讨论】:

    【解决方案3】:

    这是不可能的,因为 A 类不知道 B 的存在。

    【讨论】:

      【解决方案4】:

      如前所述:一般无法从 A 类访问 B 类的现场测试。

      但你可以将你的方法 getState() 声明为抽象:

      abstract class A
      {
          public abstract bool getState();
      
          void AccessState()
          {
              Console.WriteLine("state: {0}", getState());
          }
      }
      

      从 A 派生的所有类都必须实现方法 getState(或者本身是抽象的):

      class B : A
      {
          bool test = true;
          public override bool getState()
          {
              return test;
          }
      }
      

      通过这种方式,您可以强制 A 类的所有非抽象继承者提供所有抽象方法和属性的实现。您定义了 A 类可以依赖的合同。这样就可以在 A 类中调用 getState(),间接从 B 类中获取字段测试的值。

      【讨论】:

        猜你喜欢
        • 2017-12-16
        • 2021-05-05
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        • 2021-05-09
        • 2013-01-16
        • 1970-01-01
        • 2020-02-29
        相关资源
        最近更新 更多