C# 有没有一种方法可以在派生类中使用名称相同但类型不同的属性?
我有使用基类的遗留代码,代码期望customerid是int类型。然后我需要创建一个新的类DerivedClass,它的行为非常类似于基类,但现在customerid需要是一个字符串。无法修改遗留代码,因此不需要进行测试 如何使用继承(或任何其他方式)获得想要的效果 下面的Linqpad测试代码说明了我需要做什么。显然它不会编译,因为DerivedClass中的customerid需要是int。我还需要一个名为customerid的字符串属性。它必须是该名称,因为其他代码将使用该类而不是基类,并且期望相同的命名属性为string类型C# 有没有一种方法可以在派生类中使用名称相同但类型不同的属性?,c#,.net,C#,.net,我有使用基类的遗留代码,代码期望customerid是int类型。然后我需要创建一个新的类DerivedClass,它的行为非常类似于基类,但现在customerid需要是一个字符串。无法修改遗留代码,因此不需要进行测试 如何使用继承(或任何其他方式)获得想要的效果 下面的Linqpad测试代码说明了我需要做什么。显然它不会编译,因为DerivedClass中的customerid需要是int。我还需要一个名为customerid的字符串属性。它必须是该名称,因为其他代码将使用该类而不是基类,并
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
当Derived
实例存储在IBase
类型的变量中时,customerid
将解析为int
版本,当它存储在IDerived
类型的变量中时,将解析为字符串
版本:
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();
var customerid = instance.customerid; // <- this won't compile
var实例=新派生();
var customerid=instance.customerid;//是否可以使用?对于VB程序员,在为属性、字段等创建新定义时,请使用关键字“Shadows”。如果返回值不匹配,则在强制转换为父类型时,这可能会影响动态编程。+1更喜欢显式接口,而不是隐藏基的含义
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