Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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# - Fatal编程技术网

如何在C#中专门化派生类的成员类型?

如何在C#中专门化派生类的成员类型?,c#,C#,我想这样做: 其中计划具有联系人属性,并且有计划和联系人的专门化 我试过了 abstract class Contact { } class SpecialContact : Contact { } abstract class Plan { public virtual Contact contact; } class SpecialPlan : Plan { public override SpecialContact contact; } 但是类型重写在C#中是被禁止

我想这样做:

其中
计划
具有
联系人
属性,并且有
计划
联系人
的专门化

我试过了

abstract class Contact { }

class SpecialContact : Contact { }

abstract class Plan {
   public virtual Contact contact;
}

class SpecialPlan : Plan {
   public override SpecialContact contact;
}
但是类型重写在C#中是被禁止的

如何对此建模并专门化子类的子属性

我只需要强制执行
SpecialPlan
将只有
SpecialContact
。。没有任何其他
联系人

void Main()
void Main()
{
    var sp = new SpecialPlan();
    sp.Contact = new SpecialContact(); // new Contact(); won't compile
}

abstract class Contact
{
}

class SpecialContact : Contact
{
}

abstract class Plan<T> where T: Contact
{
    public T Contact { get; set; }
}

class SpecialPlan : Plan<SpecialContact>
{
}
{ var sp=新的SpecialPlan(); sp.Contact=new SpecialContact();//新联系人();无法编译 } 抽象类接触 { } 班级特别联系人:联系人 { } 抽象类计划,其中T:Contact { 公共T联系人{get;set;} } 班级特别计划:计划 { }
如果要重写get/set属性

void Main()
{
    var sp = new SpecialPlan();
    sp.Contact = new SpecialContact(); // new Contact(); won't compile
}

abstract class Contact
{
}

class SpecialContact : Contact
{
}

abstract class Plan<T> where T: Contact
{
    protected T contact;
    public virtual T Contact { get { return contact; } set { contact = value; } }
}

class SpecialPlan : Plan<SpecialContact>
{
    public override SpecialContact Contact { get { return contact; } set { contact = value; } }
}
void Main()
{
var sp=新的SpecialPlan();
sp.Contact=new SpecialContact();//新联系人();无法编译
}
抽象类接触
{
}
班级特别联系人:联系人
{
}
抽象类计划,其中T:Contact
{
保护T形触点;
公共虚拟T联系人{get{return Contact;}set{Contact=value;}}
}
班级特别计划:计划
{
公共重写特殊联系人{get{return Contact;}set{Contact=value;}}
}

您为什么需要延长联系时间?您是否需要添加方法,或者是否可以让Contact成为一个接口?除非您需要实际实例化
Plan
Contact
,否则可以将它们作为抽象基类。或者,您可以使用接口。或者,您可以将
Plan
SpecialPlan
Contact
SpecialContact
之间的区别封装在各种策略类中,这些策略类可以分别是
Plan
Contact
的成员。记住:组合优先于继承我只想强制执行
SpecialPlan
将只有
SpecialContact
。。没有任何其他的
联系人
关于
特殊计划
特殊联系人
有什么特别之处?