我有以下情况如下:
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)
我可以这样做吗?如何设置派生类来实现这一目标?多谢你们.
编辑:基本上,我有一堆派生类,每个类都有一个该类独有的属性.它不会因每个实例而异,因此我认为应该是一个静态变量.此外,该属性由方法设置,对于每个类都是相同的.我试图避免在每个派生类中复制和粘贴该属性和方法的逻辑.我认为最好以某种方式将该逻辑移动到从中派生每个类的基类.但是,我需要每个派生类都有自己的属性副本.我不一定要这样做,如果你们有任何好的话,我会很高兴听到一些更好的做法建议..谢谢!
我有以下类结构:
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.
我相信,一个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) 请考虑以下示例代码:
#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'的直接基础
为什么会出现此错误?如果我将基类设为虚拟,则错误不再存在.这是什么原因?
即使当前实例是派生类,我们如何从基类中的另一个方法调用虚方法?
我知道我们可以调用方法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) 我刚刚通过继承为我的页面创建了一个基类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)
有人可以解释这两种方法的优缺点吗?你什么时候会使用一个而不是另一个,或者它们都是一样的?如果同时使用两者会怎样?
如果我有一个基类:
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)
(我知道这只是一个声明而不是定义)我得到一个错误,直到我定义了不带参数的默认构造函数.这是因为基类的默认构造函数是派生类调用的构造函数吗?
我有一个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) 我最近阅读了有关复制和交换的内容,现在我正在尝试在基类和派生类中实现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) 我找不到如何在 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)
或使用beforeLaunch或onPrepare(但想要一个函数,不确定如何以这种方式公开变量),但没有成功。
但是,对于这种代码重用,我更喜欢通用的 Javascript 方法。
有什么好的方法可以避免在任何地方重复这种常见的代码,尤其是在测试中(mocha、karma、protractor)?
base-class ×10
inheritance ×5
c# ×4
c++ ×4
constructor ×3
asp.net ×1
c++11 ×1
casting ×1
clone ×1
code-reuse ×1
javascript ×1
overriding ×1
testing ×1