父类的特性

时间:2016-07-18 14:34:48

标签: c# inheritance interface polymorphism abstract-class

如果我有父类或接口以及2个从父级继承或实现接口的子类,并且我在父级中有共同的属性,但每个子级中有一些属性不同。我应该收集父类/接口中的所有属性还是将它们分开?

abstract class Customer
{
  string name { get; set; }
}

class GoldCustomer : Customer
{
  string Address { get; set;}
}

class SilverCustomer : Customer
{
  string Telephone { get; set;}
}

如果我将它们分开然后从指向孩子的父母创建一个引用,那么我就无法访问分离的子属性

Customer c = new GoldCustomer();
c.Address // error

哪种架构更正确,不违反任何设计模式?

abstract class Customer
{
  string name { get; set; }
  string Address { get; set;}
  string Telephone { get; set;}
}

class GoldCustomer : Customer
{

}

class SilverCustomer : Customer
{

}


Customer c = new GoldCustomer();
c.Address = "";

3 个答案:

答案 0 :(得分:1)

我会稍微改变@ itsme86的方法,以便我只在一个特定的Address上设置TelephoneContactInfo

public class Customer<T> where T : IContactInfo
{
    public string Name { get; }
    public T ContactInfo { get; }
}

public interface IContactInfo
{  }

public class GoldContactInfo : IContactInfo
{
    public string Address { get; }
}

public class SilverContactInfo : IContactInfo
{
    public string Telephone { get; }
}

public class GoldCustomer : Customer<GoldContactInfo>
{
     // Here does the GoldCustomer have a GoldContactInfo
}

public class SilverCustomer : Customer<SilverContactInfo>
{
     // Here does the SilverCustomer have a SilverContactInfo
}

答案 1 :(得分:0)

我可能会选择另外一组包含客户类型的不同联系信息的类,而不是使用继承:

public class Customer
{
    public string Name { get; }
    public ContactInfo ContactInfo { get; }
    // Other common properties
}

public abstract class ContactInfo
{
    public virtual string Address => "";
    public virtual string Telephone => "";
}

public class GoldContactInfo : ContactInfo
{
    public override string Address { get; }
}

public class SilverContactInfo : ContactInfo
{
    public override string Telephone { get; }
}

答案 2 :(得分:0)

在考虑继承和属性时,最简单的方法是根据&#34; is-a&#34;来考虑它们。和&#34;有一个&#34;。

Customer是否有AddressTelephone怎么样?如果一般Customer没有地址,则以下内容毫无意义:

Customer c = new GoldCustomer();
c.Address = "";  // Customer does not have an Address property

实际对象 具有Address属性这一事实无关紧要。您已将其声明为Customer变量,因此编译器会将其视为此变量。

如果所有客户都有地址和电话,那么其他哪些属性或行为会使SilverCustomer与&#34;常规&#34;顾客?您可能还会发现Custmoer的属性指示级别也更简单,但这取决于实际使用情况。