【问题标题】:c# inheritance: change field data type and value in derived classc#继承:更改派生类中的字段数据类型和值
【发布时间】:2017-11-05 17:22:48
【问题描述】:

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

示例代码:

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 原则,但你知道,人们有时会对此感到困惑,就像我一样 :-)

【问题讨论】:

  • 我问这个的原因是我看到很多机会在我想做的事情中发生,我不能只是一遍又一遍地重复相同的代码。

标签: c# oop inheritance


【解决方案1】:

这样做的方法是让你的属性在基类中是虚拟的:

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; } 
  }
}

这是假设DifferentDBContextDBContext

【讨论】:

  • 为什么这被标记为正确答案?这在 C# 中是不可能的语法。见this questionCS1715 compiler error
  • 感谢收看这个!更新后的代码应该可以工作了。
【解决方案2】:

您应该使用数据库上下文的接口或数据库上下文的基类。

public interface IDbContext{}
public class ContextA : IDbContext{}
public class ContextB : IDbContext{}

public class A
{
      protected IDbcontext DB { get; set; }
      public A(IDbcontext db)
      {
           DB = db;
      }
}
public class B : A
{
      public B():this(new ContextB(){}
      public B(IDbcontext db):base(db){}
}

有些类似的,继承上下文的类似方法也是如此。

另一种方法是创建一个抽象基类,其中基类再次通过接口或继承请求 dbcontext。

【讨论】:

  • 抱歉,您能详细说明一下吗?我想我今天只是信息过载,我刚刚学到的代码和概念发生了很多变化,所以我想我错过了这部分,或者稍后会处理。
  • 我想这应该可行。 '对像'this(new Contextb()){}'这样的OOP部分很新,现在不能完全理解它们:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 2021-11-02
  • 2018-03-14
  • 1970-01-01
相关资源
最近更新 更多