标签: base-class

我可以有一个基类,每个派生类都有自己的静态属性副本吗?

我有以下情况如下:

class Base
{
     public static int x;
     public int myMethod()
     {
          x += 5;
          return x;
     }

}

class DerivedA : Base
{
}

class DerivedB : Base
{
}
Run Code Online (Sandbox Code Playgroud)

我试图设置它,以便每个派生类都有自己的静态x实例,如果我做这样的事情:

 DerivedA.x = 5;
 DerivedB.x = 10;
Run Code Online (Sandbox Code Playgroud)

然后当我跑:

 DerivedA.myMethod(); //The result will be 10
 DerivedB.myMethod(); //The reusult will be 15
Run Code Online (Sandbox Code Playgroud)

我可以这样做吗?如何设置派生类来实现这一目标?多谢你们.

编辑:基本上,我有一堆派生类,每个类都有一个该类独有的属性.它不会因每个实例而异,因此我认为应该是一个静态变量.此外,该属性由方法设置,对于每个类都是相同的.我试图避免在每个派生类中复制和粘贴该属性和方法的逻辑.我认为最好以某种方式将该逻辑移动到从中派生每个类的基类.但是,我需要每个派生类都有自己的属性副本.我不一定要这样做,如果你们有任何好的话,我会很高兴听到一些更好的做法建议..谢谢!

c# inheritance base-class derived-class

5
推荐指数
2
解决办法
5729
查看次数

C#将对象转换为基类列表

我有以下类结构:

public class Fruit { }
public class Apple : Fruit { }
Run Code Online (Sandbox Code Playgroud)

然后我使用.net框架中的一个方法,该方法从作为对象返回的类中获取属性值.所以,

// values will be of type List<Apple>
object values = someObject.GetValue()
Run Code Online (Sandbox Code Playgroud)

我现在有了List类型的这个值对象,我想将它转换为类型为Fruit的List.我试过以下但是没有用.

List<Fruit> fruits = values as List<Fruit>;
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何将对象转换为其基类的List?

更新:在转换时我不知道值对象是List类型我知道它应该是一个继承自Fruit的类型的List.

c# casting base-class

5
推荐指数
1
解决办法
4591
查看次数

你可以覆盖基类中定义的私有函数吗?

我相信,一个derived class可以override只对那些从继承的功能base class.我的理解是否正确?

也就是说,如果基类具有公共成员函数func,那么派生类可以override是成员函数func.

但是如果基类有私有成员函数说foo,那么派生类不能覆盖成员函数foo.

我对吗?

编辑

在研究了SO成员给出的答案后,我想出了一个代码示例.我提到我在代码中作为评论研究的要点.希望我是对的.谢谢

/* Points to ponder:
   1. Irrespective of the access specifier, the member functions can be override in base class.
      But we cannot directly access the overriden function. It has to be invoked using a public
      member function of base class.
   2. A base class pointer holding the derived class obj's address can access only those members …
Run Code Online (Sandbox Code Playgroud)

c++ overriding base-class derived-class

5
推荐指数
3
解决办法
4万
查看次数

添加虚拟删除错误:类型'base'不是派生类的直接基础

请考虑以下示例代码:

#include <iostream>

using namespace std;

class base
{
   public:
      base()
      {
         cout << "ctor in base class\n";
      }
};

class derived1 : public base
{
   public:
      derived1()
      {
         cout <<"ctor in derived1 class\n";
      }
};

class derived2 : public derived1
{
   public:
      derived2() : base()
      {
         cout << "ctor in derived2 class\n";
      }
};

int main()
{
   derived2 d2obj;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这给出了错误:

错误:类型`base'不是`derived2'的直接基础

为什么会出现此错误?如果我将基类设为虚拟,则错误不再存在.这是什么原因?

c++ inheritance base-class derived-class

5
推荐指数
2
解决办法
2万
查看次数

即使当前实例是派生类,我们如何从基类中的另一个方法调用虚方法?

即使当前实例是派生类,我们如何从基类中的另一个方法调用虚方法?

我知道我们可以调用方法2基地从方法的类派生类使用base.Method2() ,但我想要做的就是从其他的虚拟方法调用它什么基础类.可能吗?

using System;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main( string[] args )
    {
      Base b = new Derived(  );
      b.Method1(  );
    }
  }


  public class Base
  {
    public virtual void Method1()
    {
      Console.WriteLine("Method1 in Base class.");
      this.Method2( );   // I want this line to always call Method2 in Base class, even if the current instance is a Derived object.
      // I want 'this' here to always …
Run Code Online (Sandbox Code Playgroud)

c# virtual-functions base-class derived-class

5
推荐指数
2
解决办法
6734
查看次数

ASP.NET CodeFileBaseClass 属性与从 System.Web.UI.Page 继承

我刚刚通过继承为我的页面创建了一个基类System.Web.UI.Page

public abstract class PageBase : System.Web.UI.Page
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我注意到您还可以在 ASP.NET 视图中声明一个基页时:

<%@ Page Language="C#" CodeFileBaseClass="PageBase.cs" CodeFile="page.aspx.cs"
    Inherits="page" %>
Run Code Online (Sandbox Code Playgroud)

有人可以解释这两种方法的优缺点吗?你什么时候会使用一个而不是另一个,或者它们都是一样的?如果同时使用两者会怎样?

asp.net inheritance base-class

5
推荐指数
1
解决办法
5714
查看次数

派生类构造函数调用

如果我有一个基类:

class Base{
  ...
};
Run Code Online (Sandbox Code Playgroud)

和派生类

class Derived : public Base{
  ...
}
Run Code Online (Sandbox Code Playgroud)

这个派生类总是调用基类的默认构造函数吗?即不带参数的构造函数?例如,如果我为基类定义构造函数:

Base(int newValue);
Run Code Online (Sandbox Code Playgroud)

但我没有定义默认构造函数(无参数构造函数):

Base();
Run Code Online (Sandbox Code Playgroud)

(我知道这只是一个声明而不是定义)我得到一个错误,直到我定义了不带参数的默认构造函数.这是因为基类的默认构造函数是派生类调用的构造函数吗?

c++ inheritance constructor base-class derived-class

5
推荐指数
1
解决办法
2万
查看次数

如何基于父类实例创建子类构造函数?

我有一个Item和一个子类AdvancedItem(如果重要的话,所有都由值类型组成):

public Item
{
    public string A;
    public bool B;
    public char C;
    ...// 20 fields
}

public AdvancedItem : Item
{
    public string Z;
}
Run Code Online (Sandbox Code Playgroud)

单独创建Item或AdvancedItem很容易:

var item = new Item { A = "aa", B = true, C = 'c', ... };
var aItem = new AdvancedItem { A = "aa", B = true, C = 'c', ..., Z = "zz" };
Run Code Online (Sandbox Code Playgroud)

现在,我只想通过分别提供字符串Z将Item转换为AdvancedItem.为了实现这一点,我正在考虑使用构造函数.

尝试A:

// annoying, we are not using the inheritance of AdvancedItem:Item
// so …
Run Code Online (Sandbox Code Playgroud)

c# inheritance constructor clone base-class

5
推荐指数
1
解决办法
2077
查看次数

复制和交换基类和派生类

我最近阅读了有关复制和交换的内容,现在我正在尝试在基类和派生类中实现ctors.我的base和派生类中都有四个构造函数,但是我不确定如何实现派生类的赋值运算符.

explicit Base(int i) : m_i{i} {}
Base(const Base & other) : m_i{other.m_i}
Base(Base && other) : Base(0) { swap(*this, other); }
Base & operator=(Base other) { swap(*this, other); return *this; }
friend void swap(Base & a, Base & b) noexcept {
    using std::swap;
    swap(a.m_i, b.m_i);
}

explicit Derived(int j) : Base(42), m_j(j) {}
Derived(const Derived & other) : Derived(other.m_j) {}
Derived(Derived && other) : Derived(other.m_j) { swap(*this, other); }
Derived & operator=(Derived other) { /*???*/ }
friend …
Run Code Online (Sandbox Code Playgroud)

c++ constructor base-class derived-class c++11

5
推荐指数
1
解决办法
1923
查看次数

如何在 Javascript 中添加所有测试使用的全局变量?

我找不到如何在 Javascript 中删除代码重复(基本上是我在 Java 中使用基类实现的)。

具体示例是(至少)以下代码,它对所有规范文件(以及潜在的页面对象,因为我正在量角器中使用该模式进行测试)都是通用的:

var chai = require("chai");
var chaiAsPromised = require("chai-as-promised");
chai.use(chaiAsPromised);
var expect = chai.expect;
Run Code Online (Sandbox Code Playgroud)

我可以做一些有希望随处可得?我尝试在量角器配置中在规范之前加载一个文件:

specs: [
  'e2e/helpers/commonDefinitions.js',
  'e2e/**/*.spec.js'
]
Run Code Online (Sandbox Code Playgroud)

或使用beforeLaunchonPrepare(但想要一个函数,不确定如何以这种方式公开变量),但没有成功。

但是,对于这种代码重用,我更喜欢通用的 Javascript 方法。

有什么好的方法可以避免在任何地方重复这种常见的代码,尤其是在测试中(mocha、karma、protractor)?

javascript testing code-reuse code-duplication base-class

5
推荐指数
1
解决办法
2158
查看次数