是否有一种方法可以在派生类中使用名称相同但类型不同的属性?
本文关键字:属性 类型 一种 方法 派生 是否 | 更新日期: 2023-09-27 18:17:53
我有使用BaseClass的遗留代码,代码期望customerid为int类型。然后我需要创建一个新类,DerivedClass,它的行为非常像BaseClass,但现在customerid需要是一个字符串。不能修改遗留代码,因此不需要进行测试。
如何使用继承(或任何其他方式)获得我想要的效果?
下面的Linqpad测试代码说明了我需要做什么。显然,它不会编译,因为派生类中的customerid需要是int。我还需要一个名为customerid的字符串属性。它需要是那个名称,因为其他代码将使用这个类而不是BaseClass,并且期望相同的命名属性是字符串类型。public class BaseClass
{
public virtual int customerid {get; set;}
public void printname()
{
customerid = 1;
customerid.Dump();
}
}
public class DerivedClass : BaseClass
{
public override string customerid {get; set;}
public void PrintCustomerID()
{
customerid = "jshwedeX";
customerid.Dump();
}
}
void Main()
{
DerivedClass dc = new DerivedClass();
dc.printname();
}
可以这样使用new
修饰符:
public class BaseClass
{
public virtual int customerid {get; set;}
public void printname()
{
customerid = 1;
customerid.Dump();
}
}
public class DerivedClass : BaseClass
{
public new string customerid {get; set;}
public void PrintCustomerID()
{
customerid = "jshwedeX";
customerid.Dump();
}
}
这将为您提供所需的结果,但它也将隐藏基类上的属性。如果你引用DerivedClass
的实例作为BaseClass
变量,你将只能引用基类上的属性;不是派生类。
换句话说:
BaseClass instance = new DerivedClass();
string customerId = instance.customerid; // <- this won't compile
另一种选择是使用显式接口实现:
public interface IBase
{
int customerid { get; set; }
}
public interface IDerived
{
string customerid { get; set; }
}
public class Derived : IBase, IDerived
{
int IBase.customerid { get; set; }
string IDerived.customerid { get; set; }
}
当您的Derived
实例存储在IBase
类型的变量中时,customerid
将解析为int
版本,当它存储在IDerived
类型的变量中时,它将解析为string
版本:
var derived = new Derived();
IBase ibase = derived;
IDerived iderived = derived;
int id1 = ibase.customerid; // <- compiles just fine
string id2 = iderived.customerid; // <- compiles just fine
你也可以使用类型转换:
var instance = new Derived();
int id1 = ((IBase)instance).customerid;
string id2 = ((IDerived)instance).customerid;
请记住,显式接口实现导致实现的成员不可见,除非变量是接口类型:
var instance = new Derived();
var customerid = instance.customerid; // <- this won't compile