我有使用BaseClass的遗留代码,代码期望customerid是int类型.然后我需要创建一个新类DerivedClass,它的行为与BaseClass非常相似,但现在customerid需要是一个字符串.无法修改遗留代码,因此不需要进行测试.
如何使用继承(或任何其他方式)获得我想要的效果?
下面的Linqpad测试代码说明了我需要做什么.显然它不会编译,因为DerivedClass中的customerid需要为int.我还需要一个名为customerid的字符串属性.它需要是该名称,因为其他代码将使用此类而不是BaseClass,并期望相同的命名属性为string类型.
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();
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*Dan 27
你可以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();
}
}
Run Code Online (Sandbox Code Playgroud)
这将为您提供所需的结果,但它也会隐藏基类的属性.如果您引用了DerivedClass一个BaseClass变量实例,那么您只能在基类上引用该属性; 不是派生类.
换一种说法:
BaseClass instance = new DerivedClass();
string customerId = instance.customerid; // <- this won't compile
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用显式接口实现:
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; }
}
Run Code Online (Sandbox Code Playgroud)
当您的实例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
Run Code Online (Sandbox Code Playgroud)
你也可以使用铸造:
var instance = new Derived();
int id1 = ((IBase)instance).customerid;
string id2 = ((IDerived)instance).customerid;
Run Code Online (Sandbox Code Playgroud)
请记住,除非变量属于接口类型,否则显式接口实现会导致实现的成员不可见:
var instance = new Derived();
var customerid = instance.customerid; // <- this won't compile
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5944 次 |
| 最近记录: |