用继承带替一堆if.else

本文通过食品加工场景,介绍了一种使用继承来避免大量条件判断的编程方法。通过定义一个基类“食品”,派生出面包、苹果和鱼等子类,并各自实现了加工方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们要处理一堆实体类时,往往判断某个属性值,做不同的操作,比如某食品加工厂

面包类,苹果类,鱼类

如果是面包 加工面包的方法 如果是苹果 加工苹果的方法 如果是鱼类 加工鱼类的方法

这样,程序会有一堆if,else和一堆方法

换个思维 一个基类叫食品,里面有个方法叫加工食品,面包类,苹果类,鱼类都继承它,实现自己的加工方法 食品类=new 面包类 面包类.加工方法 这样就行了,实例代码 static void Main(string[] args)         {             Class1 A = new Class2() { a = 1, b = 2 };             Class1 B = new Class3() { a = 2, b = 3 };             Class1 C = new Class4() { a = 1, b = 3, c = 3 };             List<Class1> list = new List<Class1>();             list.Add(A);             list.Add(B);             list.Add(C);             foreach (Class1 c in list)             {                 Console.WriteLine(c.doit());             }             Console.ReadLine();         }  public class Class2:classtest.Class1     {         public int a { get; set; }         public int b { get; set; }              public override int doit()         {             return a+b;         }     }     public class Class3 : classtest.Class1     {         public int a { get; set; }         public int b { get; set; }         public override int doit()         {             return a - b;         }     }     public class Class4 : classtest.Class1     {         public int a { get; set; }         public int b { get; set; }         public int c { get; set; }         public override int doit()         {             return a - b+c;         }     }

这利用了子类继承了父类,返回父类,同时保存子类的所有信息的特点.

class TableModel(QAbstractTableModel): def __init__(self, data=None, headers=None, parent=None): super().__init__(parent) # 初始化数据(二维列表:每行是一个列表,对应表格的一行数据) #self._data = data if data else [] self._data = [] # 列标题(列表,如["姓名", "年龄", "性别"]) #self._headers = headers if headers else [] self._headers = ["SID", "Time", "Chn", "T/Rx", "ID_index", " SendType", "RemoteFlag", "ExternFlag", "Len", "Data(hex)", "button"] def rowCount(self, parent=QModelIndex()): #"""返回行数(必须重写)""" return len(self._data) def columnCount(self, parent=QModelIndex()): #"""返回列数(必须重写)""" # new 0722 # return len(self._headers) if self._data else 0 return len(self._headers) # new 0722 # 单元格数据 def data(self, index, role=Qt.DisplayRole): #"""返回指定位置的数据(必须重写)""" # new 0723 if role == Qt.TextAlignmentRole: return Qt.AlignCenter # new 0723 if not index.isValid() or role != Qt.DisplayRole: return None # 仅处理显示角色(DisplayRole) row = index.row() col = index.column() # new 0723 if role == Qt.DisplayRole and col == 0: value = self._data[row][col].split(" ")[0] return str(value) # new 0723 if row >= len(self._data) or col >= len(self._headers): return None return self._data[row][col] # 返回第row行第col列的数据 # 表头 def headerData(self, section, orientation, role=Qt.DisplayRole): #"""返回列标题(可选重写)""" if orientation == Qt.Horizontal and role == Qt.DisplayRole: return self._headers[section] if section < len(self._headers) else None # new 添加行号行头 0721 if orientation == Qt.Vertical and role == Qt.DisplayRole: return str(section + 1) # new 添加行号行头 0721 return None # 垂直标题(行号)默认使用行索引,无需额外处理 def add_row(self, row_data): #"""动态添加一行数据(触发视图更新)""" # 通知视图:开始插入行(参数:父索引、插入位置起始行、结束行) self.beginInsertRows(QModelIndex(), self.rowCount(), self.rowCount()) self._data.append(row_data) # 实际添加数据到模型 self.endInsertRows() # 通知视图:插入完成 # def update_data(self, row, col, new_value): # #"""更新指定位置的数据(触发视图刷新)""" # if 0 <= row < len(self._data) and 0 <= col < len(self._headers): # self._data[row][col] = new_value # # 通知视图:指定位置数据已修改(参数:起始索引、结束索引) # self.dataChanged.emit(self.index(row, col), self.index(row, col)) # new 清理表格功能 0721 def clear_Table(self): rows = self.rowCount() if rows > 0: # self.beginResetModel(QModelIndex(), 0, rows -1) # new 0722 self.beginResetModel() self._data = [] # 清空数据 self.endResetModel() # 通知视图重置完成 该代码怎么进行优化,删除旧内存
最新发布
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值