如何通过对象指针调用C#对象方法/更改字段?
这里有一个简单的问题(这里是C#noob),我找不到怎么做(我有Schildt的C#4.0参考资料,但还不确定我在寻找什么) 假设我有两个由两个不同类创建的对象,但是有同名的字段和/或方法。例如:如何通过对象指针调用C#对象方法/更改字段?,c#,C#,这里有一个简单的问题(这里是C#noob),我找不到怎么做(我有Schildt的C#4.0参考资料,但还不确定我在寻找什么) 假设我有两个由两个不同类创建的对象,但是有同名的字段和/或方法。例如: public class Object1 { bool enable; public void Reset(){ enable = false; } } public class Object2 { bool enable; public void Reset(){
public class Object1 {
bool enable;
public void Reset(){
enable = false;
}
}
public class Object2 {
bool enable;
public void Reset(){
enable = false;
}
}
对象是非常不同的,因此有理由创建两个不同的对象。但是,我有许多对象具有公共的“enable”字段和“Reset()”方法
下面是我想做的事情(用伪代码或其他方式):
我该怎么做?我不知道如何创建一个可以指向来自不同类的对象的对象
谢谢
感谢所有的答案。我查看了接口,并将其理解为一个“别名”,但不知道它们有什么用处。只需使用一个通用接口,该接口可以实现
Object1
和Object2
public interface InterfaceA {
bool Enable { get; set; }
void Reset();
}
public class Object1 : InterfaceA {
public bool Enable { get; set; }
public void Reset(){
Enable = false;
}
}
public class Object2 : InterfaceA {
public bool Enable { get; set; }
public void Reset(){
Enable = false;
}
}
void Manipulate(InterfaceA pObj){
pObj.Enable = true;
pObj.Reset();
}
void Main(){
Manipulate(obj1);
Manipulate(obj2);
}
注意:我已经更改了公共自动属性的public属性,因为接口不能有数据成员,并且工作方式相同。此外,使用属性也是更好的做法…您希望执行以下操作:
public interface IEnableable {
bool Enable { get; set; }
}
public interface IResettable {
void Reset();
}
public interface IEnableableAndResettable : IEnableable, IResettable { }
它所做的是抽象您希望能够在对象上执行的操作。然后,您可以让方法操纵eat符合此抽象的对象
public class Object1 : IEnableableAndResettable {
public bool Enable { get; set; }
public void Reset() {
this.Enable = false;
}
// details
}
public class Object2 : IEnableableAndResettable {
public bool Enable { get; set; }
public void Reset() {
this.Enable = false;
}
// details
}
然后:
您甚至可以考虑给出<代码> Objuts1<代码>和<代码> Objuts2>代码>一个共同的基础:
public class Enableable : IEnableableAndResettable {
public bool Enable { get; set; }
public void Reset() { this.Enable = false; }
}
public class Object1 : Enableable { }
public class Object2 : Enableable { }
这就是接口的用途:
public interface ICanResetAndEnable
{
// Note: interfaces cannot have fields, only properties and methods.
bool Enable { get; set; }
void Reset();
}
public class Object1 : ICanResetAndEnable {
bool Enable { get; set; }
public void Reset(){
Enable = false;
}
}
public class Object2 : ICanResetAndEnable {
bool Enable { get; set; }
public void Reset(){
Enable = false;
}
}
然后定义操作
方法以接受实现此接口的任何类型的参数:
void Manipulate(ICanResetAndEnable obj)
{
// Do whatever.
}
假设您使用的是.NET4.0,您可以简单地将变量声明为动态变量,并使用后期绑定来访问该方法
dynamic myvar = GetTheObjectFromSomewhere();
myVar.Enable = true;
myVar.Reset();
我会为所有共享Reset()方法的对象创建一个接口或基类
接口:
public interface IResetable
{
void Rest();
}
public class ClassA : IResetable
{
bool Enable = true;
public void Reset()
{
Enable = false;
}
}
void Manipulate(IResetable obj){
obj.Reset();
}
..或基本类:
public class BaseResetClass
{
internal bool Enable = true;
public void Reset()
{
Enable = false;
}
}
public class ClassA : BaseResetClass
{
}
public class ClassB : BaseResetClass
{
}
var ca = new ClassA();
ca.Reset();
var ca2 = new ClassB();
ca2.Reset();
无论你做什么,都要买一本新书。几乎任何一本书都比舒尔特好。他那可怕的名声是无与伦比的。例如,我推荐Essential C#4.0:感谢书中的提示。Schildt是我尝试的第二本书,但仍然有一些概念没有进入我的脑海。例如,我完全忽略了接口的要点。+1抵消了否决票。虽然我建议使用接口,但这是一个有效的解决方案。我确信这可能被滥用。但是如果使用得当,这是非常优雅和简单的,可以与现有的设计一起使用,而无需进行重大的重构。这是一个有趣的解决方案。我想到了这一点,但害怕运行时出错。编译器是否检查所有可能分配给“myvar”的对象,或者如果错误的对象进入其中,我是否必须捕获异常?如果对象instace与方法/属性签名不匹配,则需要捕获异常。尽管如此,在某些情况下(你可以控制通过的内容),这是一个相当优雅的解决方案。有点像RoR的“约定优先于配置”的概念,我喜欢接口的分离。谢谢你对这方面的见解!
public interface IResetable
{
void Rest();
}
public class ClassA : IResetable
{
bool Enable = true;
public void Reset()
{
Enable = false;
}
}
void Manipulate(IResetable obj){
obj.Reset();
}
public class BaseResetClass
{
internal bool Enable = true;
public void Reset()
{
Enable = false;
}
}
public class ClassA : BaseResetClass
{
}
public class ClassB : BaseResetClass
{
}
var ca = new ClassA();
ca.Reset();
var ca2 = new ClassB();
ca2.Reset();