这是一个简单的问题(这里是C#noob),我找不到如何做到这一点(我有Schildt的C#4.0参考,但不确定我在寻找什么)。
假设我有两个不同类创建的对象,但是具有相同名称的字段和/或方法。例如:
public class Object1 {
bool enable;
public void Reset(){
enable = false;
}
}
public class Object2 {
bool enable;
public void Reset(){
enable = false;
}
}
对象非常不同,证明了创建两个不同对象的合理性。但是,我有许多具有公共'enable'字段和'Reset()'方法的对象。
所以这就是我想要做的事情(伪代码或其他任何内容):
void Manipulate(ref object pObj){
(pObj).enable = true;
(pObj).Reset();
}
void Main(){
Manipulate(obj1);
Manipulate(obj2);
}
我该怎么做?我不知道如何创建一个可以指向来自不同类的对象的对象。
谢谢!
感谢所有答案。我浏览了接口并将它们理解为“别名”,并且无法弄清楚它们的用处是什么。
答案 0 :(得分:5)
这是接口的用途:
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;
}
}
然后定义Manipulate
方法以接受实现此接口的任何类型的参数:
void Manipulate(ICanResetAndEnable obj)
{
// Do whatever.
}
答案 1 :(得分:1)
只需使用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);
}
注意:我已经更改了公共自动属性的公共属性 - 因为接口不能拥有数据成员并且工作方式相同。此外,使用属性也是更好的做法......
答案 2 :(得分:1)
你想做这样的事情:
public interface IEnableable {
bool Enable { get; set; }
}
public interface IResettable {
void Reset();
}
public interface IEnableableAndResettable : IEnableable, IResettable { }
这样做是抽象出您希望能够对对象执行的操作。然后,您可以使方法Manipulate
吃掉符合此抽象的对象。
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
}
然后:
void Manipulate(IEnableableAndResettable enableableAndResettable){
enableableAndResettable.Enable = true;
enableableAndResettable.Reset();
}
您甚至可以考虑将Object1
和Object2
作为共同基础:
public class Enableable : IEnableableAndResettable {
public bool Enable { get; set; }
public void Reset() { this.Enable = false; }
}
public class Object1 : Enableable { }
public class Object2 : Enableable { }
答案 3 :(得分:1)
鉴于您使用的是.NET 4.0,您可以简单地将变量声明为动态,并使用后期绑定来访问该方法。
dynamic myvar = GetTheObjectFromSomewhere();
myVar.Enable = true;
myVar.Reset();
答案 4 :(得分:0)
我会为共享方法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();