21

我有使用 BaseClass 的旧代码,并且代码期望 customerid 是 int 类型。然后我需要创建一个新类 DerivedClass,它的行为非常类似于 BaseClass,但现在 customerid 需要是一个字符串。遗留代码无法修改,因此不需要测试。

如何使用继承(或任何其他方式)获得我想要的效果?

下面的 Linqpad 测试代码说明了我需要做什么。显然它不会编译,因为 DerivedClass 中的 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();
}
4

1 回答 1

30

您可以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存储在 type 的变量中时IBasecustomerid将解析为int版本,当它存储在 type 的变量中时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
于 2013-06-12T00:01:55.457 回答