如果我有父类或接口以及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 = "";
答案 0 :(得分:1)
我会稍微改变@ itsme86的方法,以便我只在一个特定的Address
上设置Telephone
或ContactInfo
:
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
是否有Address
? Telephone
怎么样?如果一般Customer
没有地址,则以下内容毫无意义:
Customer c = new GoldCustomer();
c.Address = ""; // Customer does not have an Address property
实际对象 具有Address
属性这一事实无关紧要。您已将其声明为Customer
变量,因此编译器会将其视为此变量。
如果所有客户都有地址和电话,那么其他哪些属性或行为会使SilverCustomer
与&#34;常规&#34;顾客?您可能还会发现Custmoer
的属性指示级别也更简单,但这取决于实际使用情况。