Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种方法可以在派生类中使用名称相同但类型不同的属性?_C#_.net - Fatal编程技术网

C# 有没有一种方法可以在派生类中使用名称相同但类型不同的属性?

C# 有没有一种方法可以在派生类中使用名称相同但类型不同的属性?,c#,.net,C#,.net,我有使用基类的遗留代码,代码期望customerid是int类型。然后我需要创建一个新的类DerivedClass,它的行为非常类似于基类,但现在customerid需要是一个字符串。无法修改遗留代码,因此不需要进行测试 如何使用继承(或任何其他方式)获得想要的效果 下面的Linqpad测试代码说明了我需要做什么。显然它不会编译,因为DerivedClass中的customerid需要是int。我还需要一个名为customerid的字符串属性。它必须是该名称,因为其他代码将使用该类而不是基类,并

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

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

下面的Linqpad测试代码说明了我需要做什么。显然它不会编译,因为DerivedClass中的customerid需要是int。我还需要一个名为customerid的字符串属性。它必须是该名称,因为其他代码将使用该类而不是基类,并且期望相同的命名属性为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();
}

您可以像这样使用
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