我一直相信他们做到了,但在这里看到一些答案让我怀疑......
我可以通过反射从类外部访问私有字段/属性/方法吗?
如果我把控件放在像这样的.aspx文件中;
<asp:TextBox ID="protectedTextBox" runat="server">Some info</asp:TextBox>
Run Code Online (Sandbox Code Playgroud)
我在页面的.aspx.designer.cs文件中获得了一个声明的控件;
protected global::System.Web.UI.WebControls.TextBox protectedTextBox;
Run Code Online (Sandbox Code Playgroud)
但是我想将控件的访问修饰符更改为public.我可以设置任何属性或类似物来更改访问修饰符吗?
这就是我想要做的原因.我试图让跨页回发工作很好,整洁.我有两页:
FirstPage.aspx
MyTextBox : textbox
MyButton : button, @PostbackUrl=Secondpage
SecondPage.aspx
MyLabel : label
Run Code Online (Sandbox Code Playgroud)
当用户单击FirstPage.MyButton时,我想写入FirstPage.MyTextBox.Textinto 的值SecondPage.MyLabel.Text.我可以使用Page.FindControl来做到这一点,但这似乎是将上一页作为FirstPage对象进行转换并直接引用其上的MyTextBox控件的不良替代品.像这样的东西;
// on the page_load of SecondPage.aspx;
var previousPage = this.PreviousPage as FirstPage;
this.MyLabel.Text = previousPage.MyTextBox.Text;
Run Code Online (Sandbox Code Playgroud)
有没有办法更改访问修饰符?
是否有可以通过可视化工作室解决方案运行的工具,并将访问修饰符调整为未在解决方案中调用的任何内容转换为私有或内部(如果适用)?
我想我可以将所有内容更改为私有,然后使用编译器消息并手动执行...但这可能需要一段时间,如果有自动的东西,这将是太棒了!
在C++中,您可以执行以下操作:
class base_class
{
public:
virtual void do_something() = 0;
};
class derived_class : public base_class
{
private:
virtual void do_something()
{
std::cout << "do_something() called";
}
};
Run Code Online (Sandbox Code Playgroud)
该derived_class覆盖的方法do_something(),并使得它private.结果是,调用此方法的唯一方法是这样的:
base_class *object = new derived_class();
object->do_something();
Run Code Online (Sandbox Code Playgroud)
如果将对象声明为类型derived_class,则无法调用该方法,因为它是私有的:
derived_class *object = new derived_class();
object->do_something();
// --> error C2248: '::derived_class::do_something' : cannot access private member declared in class '::derived_class'
Run Code Online (Sandbox Code Playgroud)
我认为这很好,因为如果你创建一个用作接口的抽象类,你可以确保没有人意外地声明一个字段作为具体类型,但总是使用接口类.
由于在C#/.NET一般来说,你不能缩小从接入public到private重载的方法时,有没有办法在这里实现类似的效果?
有没有一种很好的方法来实现它,以便在我使用NUnit进行测试时函数是公共的,但是否则是私有的?
不必生成大量无关代码也不错.
- - - - - - - - - - - - 编辑 - - - - - - - - - - - -
似乎解决方案属于3种类型:
有没有办法以编程方式执行此操作?即只需创建一个新的临时应用程序,使所有protected/private/internal功能public,插入NUnit,在那里运行测试,然后回到使用私有函数的发布版本?
我正在测试在构造函数中调用虚拟成员的效果,并发现在调用该成员时,生成的异常被包装在一个TargetInvocationException.
根据文档,这是:
由反射调用的方法抛出的异常
但是我没有意识到通过反射的任何调用.那么这是否意味着虚拟成员总是通过反射来调用?如果没有,为什么在这种情况下呢?
代码:
class ClassA
{
public ClassA()
{
SplitTheWords();
}
public virtual void SplitTheWords()
{
//I've been overidden
}
}
class ClassB : ClassA
{
private readonly String _output;
public ClassB()
{
_output = "Constructor has occured";
}
public override void SplitTheWords()
{
String[] something = _output.Split(new[]{' '}); //TargetInvocationException!
}
}
Run Code Online (Sandbox Code Playgroud) 在测试类方法时,有时我需要将返回值与某个类中定义的某个常量进行比较。
class FooBar
{
const RANDOM = 18;
}
....
// Somewhere in test...
$this->assertEquals(FooBar::RANDOM, $mock->doSomething());
Run Code Online (Sandbox Code Playgroud)
现在,从 PHP 7.1 开始,可以使用可见性修饰符定义类常量,这可以更改为:
private const RANDOM = 18;
Run Code Online (Sandbox Code Playgroud)
然而,这会阻止测试工作,因为现在我们正在尝试访问私有常量。
所以现在我们有两个选择:
$this->assertEquals(
(new ReflectionClass(FooBar::class))->getConstant('RANDOM'),
$mock->doSomething()
);
第一种方法感觉非常错误,因为我们只是为了测试而不断公开,而不是因为类/层次结构/业务模型需要它公开。
第二个感觉也不对劲,因为任何 IDE 都找不到这个用例,因此任何搜索/替换/重构都会在这里失败。
所以我的问题是,是否应该使用第二种场景而不关心重构会破坏测试?或者甚至可能在断言中不鼓励使用一般常量?
C++ 中的 java“私有包”等效项是什么?Java 包隐私功能(只有同一包中的类具有可见性)在提供 API 时非常有用。
C++ 是否有类似的功能(除了将其他类声明为“朋友”之外)?详细说明,例如假设 Ah 和 Bh 位于同一个包中(即 API lib)文件:Ah
class A
{
public :
void doA();
private :
int m_valueA;
};
Run Code Online (Sandbox Code Playgroud)
文件:Bh
class B
{
public :
void doB()
private:
int m_valueB;
}
Run Code Online (Sandbox Code Playgroud)
我想要的是,
公共可见性:仅 A::doA() 和 B::doB()
在包内(即 API lib):A 应该能够访问 B::m_valueB 并且 B 应该能够访问 A::m_valueA。 不让彼此成为“朋友”课程。
在Python中,类中的受保护变量和公共变量有什么区别
class A:
def __init__(self):
self._protected="protected"
self.__private="private"
self.public="public"
>>> a = A()
>>> a.public
'public'
>>> a._protected
'protected'
>>>
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下其中的区别,并指导我如何在 python 中使用受保护的变量吗[如果我的方法用法是错误的]
提前致谢。
我有一个 Vue.js v2.6 项目,其中包含 TypeScript v.4.3“底层”。我的问题:我找不到任何可以澄清的文档,说明在Vue 组件
中
使用是否有意义以及如何正确使用它们。
我搜索了文章、Vue.js 文档和 StackOverflow,但没有任何发现。(Vue.js 文档完全忽略了它们的存在!)access modifiers
这就是我目前在 Vue 组件中使用访问修饰符的方式:
myComponent.vue 的模板部分:
<template>
<div>
<!-- accessing some of the fields of the class here e.g. the getter -->
</div>
</template>
Run Code Online (Sandbox Code Playgroud)
myComponent.vue 的脚本部分:
<script lang="ts">
import { Vue, Component, Prop, Emit } from "vue-property-decorator";
@Component()
export default class MyComponent extends Vue {
@Prop() public readonly myPropertyVariable!: boolean;
public myVariable!: string; // accessed in template
private myInternalVariable!: boolean; // not accessed …Run Code Online (Sandbox Code Playgroud) access-modifiers typescript vue.js vuejs2 vue-class-components
access-modifiers ×10
c# ×5
.net ×3
c++ ×2
asp.net ×1
class ×1
constants ×1
controls ×1
debugging ×1
exception ×1
inheritance ×1
nunit ×1
php-7.1 ×1
protected ×1
python-3.x ×1
refactoring ×1
reflection ×1
typescript ×1
unit-testing ×1
virtual ×1
vue.js ×1
vuejs2 ×1