C# 继承 : change field data type and value in derived class

标签 c# oop inheritance

是否可以在派生类中更改基类字段数据类型和值,并仍然调用基类方法但使用派生类值?

示例代码:

public class class1 
{
  protected DBContext DB { get; set; }

  public A() 
  {
    DB = new DBContext();
  }

  public virtual DBRecord find(int id)
  {
    return DB.DBRecord.Find(id);
  }
}

public class class2 : class2
{
  protected DifferentDBContext DB { get; set; }

  public B()
  {
    DB = new DifferentDBContext();
  }
}

然后我尝试用下面的代码调用该方法。

class2 x = new class2();
x.find(1); // calls the base class method with base class field values

根据发生的情况,它使用基类变量调用基类方法。我想知道是否可以在派生类中设置字段类型/值,然后调用基类方法?因为它们只是具有相同的实现,只是使用了不同的值。

到目前为止我所做的(我觉得是多余的)和工作。

public class class2 : class1 
{
  //Other implementations omitted
  public override DBRecord find(int id)
  {
    return DB.DBRecord.Find(id);
  }
}

注意:这可能只是一个简单的 OOP 原则,但你知道,人们有时会对此感到困惑,就像我一样:-)

最佳答案

这样做的方法是在基类中使您的属性成为虚拟的:

public class class1 
{
  protected virtual DBContext DB { get; set; }
  ...
}

然后在派生类中覆盖它:

public class class2 : class1
{
  private DifferentDBContext DDB;
  protected override DBContext DB 
  { 
    get { return DDB; } 
    set { DDB = value is DifferentDBContext ? (DifferentDBContext)value : null; } 
  }
}

这是假设 DifferentDBContext 是一个 DBContext

关于C# 继承 : change field data type and value in derived class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47124390/

相关文章:

oop - 所有面向对象的设计都可以归结为减少条件吗?

C# Rx DistinctUntilChanged() 用于任何结果,包括列表

c# - 调用归并排序 C#

c# - 如何确定我在列表中引用的子类?

java - 从子类调用重载函数

javascript - 继承的 Angular 2 组件中的输入属性

c++ - 在 C++ 中的抽象接口(interface)上实现运算符重载

c# - 如何通过 WCF 传递 System.Drawing.Rectangle?

c# - 如何让wpf webview像浏览器一样滚动?

python - python3中如何重载Thread类的__init__函数?