你有两个很好的选择。第一个是继承:
public class CommonObject
{
public string Name;
public string Signature;
public string Checksum;
}
public class X : CommonObject
{
// other properties
}
public class Y : CommonObject
{
// other properties
}
public class Z : CommonObject
{
// other properties
}
public static void DoSomething(CommonObject o)
{
// You can access these values
if (o.Name == "" || o.Signature == "")
o.Checksum = 0;
}
这很强大,因为您可以将这些属性设置为虚拟属性,每个类都可以重写以不同的方式处理它们。
第二个选项是使用接口:
public class OtherClass
{
public static void DoSomething(CommonObject o)
{
// code here
}
}
public interface CommonObject
{
string Name { get; }
string Signature { get; }
string Checksum { get; }
}
public class X : CommonObject
{
private string _name = "";
private string _signature = "";
private string _checksum = "";
string CommonObject.Name { get { return _name; } }
string CommonObject.Signature { get { return _signature; } }
string CommonObject.Checksum { get { return _checksum; } }
}
static void DoSomething(CommonObject o);
- Olivier Jacot-Descombes如果您定义一个包含公共方法的共同基类,并使对象A、B和C成为该基类的子类,则可以实现...。然后,您的静态辅助方法可以将基类用作其参数类型,并且任何子类型都可以传递给它。
我认为接口是您的最佳选择,尤其是在IT技术方面。请保留HTML标签。
public interface ISomeGoodNameForCommonProperies
{
string Name {get;set;}
string Signature {get;set;}
string Checksum {get;set;}
}
public class X : ISomeGoodNameForCommonProperies
{
string Name {get;set;}
string Signature {get;set;}
string Checksum {get;set;}
...
}
public class Y : ISomeGoodNameForCommonProperies
{
string Name {get;set;}
string Signature {get;set;}
string Checksum {get;set;}
...
}
public class Z : ISomeGoodNameForCommonProperies
{
string Name {get;set;}
string Signature {get;set;}
string Checksum {get;set;}
...
}
你的辅助方法应该使用一个好的名称ISomeGoodNameForCommonProperies。
public object MyHelperMethod(ISomeGoodNameForCommonProperies myObject)
{
...
}
当然,继承可以解决问题,但是我建议避免使用基类,除非它对你要创建的对象有意义。你应该问自己一个问题:X、Y和Z能否被定义为某种不同的对象O?如果可以,请创建O并从中继承。如果这三个共同拥有的属性不足以定义一个逻辑实体,但出于实际原因需要将它们分组在一起,则接口是最佳选择。
这个问题有两种解决方法:
创建一个基类,其中包含所有这些共同属性,并从中派生其他类。
public abstract class MyBaseClass
{
public string Name { get; set; }
public string Signature { get; set; }
public int Checksum { get; set; }
}
public class ClassX : MyBaseClass
{
// Add the other properties here
}
public class ClassY : MyBaseClass
{
// Add the other properties here
}
public class ClassZ : MyBaseClass
{
// Add the other properties here
}
你的辅助方法将会有一个类型为 MyBaseClass 的参数:
public void MyHelperMethod(MyBaseClass obj)
{
// Do something with obj.Name, obj.Siganture and obj.Checksum
}
将辅助方法放在 MyBaseClass 中也是一个好主意,但不需要参数,因为现在它可以直接访问属性:
public abstract class MyBaseClass
{
public string Name { get; set; }
public string Signature { get; set; }
public int Checksum { get; set; }
public void CreateChecksum() // Your helper method
{
Checksum = Name.GetHashCode() ^ Signature.GetHashCode();
}
}
然后,您可以直接从您的对象中调用它:
objA.CreateChecksum();
objB.CreateChecksum();
objB.CreateChecksum();
或者定义一个接口,让你的三个类实现:
public interface IMyInterface
{
string Name { get; set; }
string Signature { get; set; }
int Checksum { get; set; }
}
public class ClassX : IMyInterface
{
public string Name { get; set; }
public string Signature { get; set; }
public int Checksum { get; set; }
// Add the other properties here
}
public class ClassY : IMyInterface
{
public string Name { get; set; }
public string Signature { get; set; }
public int Checksum { get; set; }
// Add the other properties here
}
public class ClassZ : IMyInterface
{
public string Name { get; set; }
public string Signature { get; set; }
public int Checksum { get; set; }
// Add the other properties here
}
你的辅助方法将拥有一个类型为IMyInterface的参数:
public void MyHelperMethod(IMyInterface obj)
{
// Do something with obj.Name, obj.Siganture and obj.Checksum
}
MyHelperMethod(objA);
MyHelperMethod(objB);
MyHelperMethod(objC);
dynamic
(它不是结构类型),我不知道C#是否还有其他技巧...标准方法是根据需要添加接口。 - user166390